【问题标题】:Find, Replace, Remove - with in file查找、替换、删除 - 在文件中
【发布时间】:2015-10-06 06:27:00
【问题描述】:

我目前正在使用此代码:

awk 'BEGIN { s = \"{$CNEW}\" } /WORD_MATCH/ { $0 = 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. 如果 $CNEW ='' 则删除包含 WORD_MATCH 的行。

文件中只有一行包含 WORD_MATCH

谢谢

【问题讨论】:

  • 这个脚本不能像写的那样工作(除非它本身嵌入在你没有向我们展示的双引号中)因为$CNEW 不会在那里被评估。 awk 也不会喜欢该作业中未加引号的字符串。你的意思是{$CNEW} 还是${CNEW}{} 文字值是否要进入文件?
  • 对不起,我应该说这是通过 php exec() 调用的

标签: bash replace awk find


【解决方案1】:
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 仍然不是1 并且s 非空,则打印s

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 2015-04-21
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2014-08-17
    • 2011-02-16
    相关资源
    最近更新 更多