【问题标题】:modifying a file using sed or awk使用 sed 或 awk 修改文件
【发布时间】:2015-03-19 16:20:26
【问题描述】:

我有一个格式如下的文件

    A  something_A something_A something_A
    B  something_B something_B something_B
    C  something_C something_C something_C

每当我在第一列中得到 A 时,都想添加一个所有值都相同的行,假设 A 被 Z 替换。最终文件应该是:

    A  something_A something_A something_A
    Z  something_A something_A something_A
    B  something_B something_B something_B
    C  something_C something_C something_C

如何在 bash 中使用 sed/awk 做到这一点?

【问题讨论】:

  • 原始罚款应该被输出覆盖

标签: bash awk sed


【解决方案1】:

通过 sed,

$ sed -i 's/^\( *\)A\( \+.*\)/&\n\1Z\2/' file
    A  something_A something_A something_A
    Z  something_A something_A something_A
    B  something_B something_B something_B
    C  something_C something_C something_C

& 打印整个匹配。 ^\( *\) 将捕获前导空格。将上述正则表达式中的空格更改为[[:space:]] 或[[:blank:]]。因为上述正则表达式中的空格与制表符不匹配。添加行内编辑-i 参数以保存对该文件所做的更改。

【讨论】:

  • 你可以做一个小的改变..如果领先的标签,它不工作......仍然,+1。
  • 简单,把空格换成[[:blank:]]
  • 添加内联编辑选项sed -i 's/^\( *\)A\( \+.*\)/&\n\1Z\2/' file
【解决方案2】:
awk '$1~/A/{print;sub(/A/,"Z")}1' File

示例:

AMD$ cat File
A  something_A something_A something_A
B  something_B something_B something_B
C  something_C something_C something_C
AMD$ awk '$1~/A/{print;sub(/A/,"Z")}1' File
A  something_A something_A something_A
Z  something_A something_A something_A
B  something_B something_B something_B
C  something_C something_C something_C

检查第一个字段是否匹配 A ($1~/A/)。如果匹配,则按原样打印该行,将同一行中的第一个A 替换为Z。这将再次打印。 1 用于最后打印不匹配的行。

【讨论】:

  • 是否保留前导空格?
  • 有点重新排列,你不需要打印 :) awk '1;$1~/A/&&sub($1,"Z")'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2013-02-18
  • 1970-01-01
  • 2011-01-10
  • 2016-10-13
  • 2014-02-02
相关资源
最近更新 更多