查找,替换,删除 - 在文件中

时间:2015-07-16 17:08:17

标签: bash replace awk find

我目前正在使用此代码:

awk 'BEGIN { s = \"{$CNEW}\" } /WORD_MATCH/ { $0 = s; n = 1 } 1; END { if(!n) print s }' filename > new_filename

要在WORD_MATCH上找到匹配项,然后在名为$CNEW的文件中将该行替换为filename,结果将写入new_filename

这一切都运作良好。但我有一个问题,我可能想删除该行而不是替换它。

所以我设置了$CNEW = '',因为我在文件中得到一个空白行,但实际上没有删除该行。

是否有适应AWK命令以允许删除线路?

总目标是:

  1. 如果包含WORD_MATCH的文件中没有一行,则根据$ CNEW

  2. 添加一行
  3. 如果包含WORD_MATCH的文件中有一行更新该行与$ CNEW的新值

  4. 如果$ CNEW ='',则删除包含WORD_MATCH的行。

  5. 他的档案中只有一行包含WORD_MATCH

    由于

1 个答案:

答案 0 :(得分:2)

awk -v s="$CNEW" '/WORD_MATCH/ { n=1; if (s) $0=s; else next; } 1; END { if(s && !n) print s }' file

如何运作

  • -v s="$CNEW"

    这会将s创建为值为$CNEW的awk变量。请注意,使用-v可以巧妙地消除尝试在BEGIN块中定义s时可能出现的引用问题。

  • /WORD_MATCH/ { n=1; if (s) $0=s; else next; }

    如果当前行与WORD_MATCH匹配,则将n设置为1。如果s非空,则将当前行设置为s。如果没有,请跳过其余命令,然后从next行重新开始。

  • 1

    这是打印线的神秘简写。

  • END { if(s && !n) print s }

    在文件末尾,如果n仍然不是1s非空,则打印s