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

Find, Replace, Remove - with in file

我目前正在使用此代码:

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

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

一切正常。但是我有一个问题,我可能想删除该行而不是替换它。

所以我设置了 $CNEW = '',它的工作原理是我在文件中得到一个空行,但实际上并没有删除该行。

是否有修改 AWK 命令以允许删除该行的方法?

总目标是:

  1. 如果文件中没有一行包含 WORD_MATCH 添加一行,基于 $CNEW

  2. 如果文件中有一行包含 WORD_MATCH,则用 $CNEW

  3. 中的新值更新该行
  4. If $CNEW ='' then delete the line contained WORD_MATCH.

文件中只有一行包含 WORD_MATCH

谢谢

awk -v s="$CNEW" '/WORD_MATCH/ { n=1; if (s) [=10=]=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) [=16=]=s; else next; }

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

  • 1

    这对于打印行来说是神秘的 shorthand。

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

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