使用 sed 或 awk 修改文件

modifying a file using sed or awk

我有一个格式如下的文件

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

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

    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 执行此操作?

awk '~/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 '~/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 (~/A/)。如果匹配,则按原样打印该行,将同一行中的第一个 A 替换为 Z。这将再次打印。 1 用于最后打印不匹配的行。

通过sed,

$ sed -i 's/^\( *\)A\( \+.*\)/&\nZ/' 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。将上述正则表达式中的 spaces 更改为 [[:space:]][[:blank:]]。因为上面正则表达式中的 space 不会匹配制表符。添加内联编辑 -i 参数以保存对该文件所做的更改。