【问题标题】:awk sub() not doing replacementawk sub() 不进行替换
【发布时间】:2020-06-24 22:05:14
【问题描述】:

示例文本文件。

in2.txt 文件:

*{commented out line}* KeyWordName = KeyWordValueAA  
KeyWordName = KeyWordValueAA

正则表达式找到字符串:

awk '/^KeyWordName[[:blank:]]=[[:blank:]].*$/' in2.txt

输出:

KeyWordName = KeyWordValueAA

不会导致错误或更改文本的命令:

awk '{sub(/^KeyWordName[[:blank:]]=[[:blank:]].*$/, "KeyWordValueBB")}' in2.txt

删除双引号也不起作用。 阅读手册页也没有帮助。

【问题讨论】:

  • 是否要将第二行KeyWordName的值改为KeyWordValueBB

标签: string awk replace


【解决方案1】:

您需要显式打印才能看到任何输出:

一个常见的 awk 习惯用法是在操作后添加1

$ awk '{sub(/^KeyWordName[[:blank:]]=[[:blank:]].*$/, "KeyWordValueBB")}1' file
{commented out line} KeyWordName = KeyWordValueAA
KeyWordValueBB

1 是一个始终为真的模式,由于没有相应的操作,因此会执行 print 的默认操作(在 所有 输入行上)。

或者你可以使用print:

$ awk '{sub(/^KeyWordName[[:blank:]]=[[:blank:]].*$/, "KeyWordValueBB")} {print}' file
{commented out line} KeyWordName = KeyWordValueAA
KeyWordValueBB

要在没有-i 选项时更改文件,请保存到一个临时文件并将其重命名为您的文件(这就是-i 为您所做的,无论如何)。通过使用&&,我们确信mv 命令只有在awk 成功终止时才会执行。不过,您可能需要先保存原始文件的副本,以防awk 从操作系统的角度来看是“成功的”,但没有达到您的预期!

awk '{ ... }' file > tmp && mv tmp file

【讨论】:

  • 谢谢你告诉我正则表达式和替换是有效的。但我需要更改文件 in2.txt,而不是缓冲区。
  • 谢谢你告诉我正则表达式和替换是有效的。但我需要更改文件 in2.txt,而不是缓冲区。我的 awk 版本不使用 awk -i inplace 参数。
  • 查看我对如何更改文件的回答的更新。
  • 由于代码必须在 IBM AIX OS 中运行,因此必须使用以下代码。 # 执行关键字值替换。 awk '{sub("^KeyWordName[[:blank:]]=[[:blank:]].*$", "KeyWordName = KeyWordValueBB")} {print}' in2.txt >> in3.txt # 执行关键字价值置换。 # vi in2.txt # vi in3.txt # 用来自 awk mv in3.txt in2.txt 的新输出文件覆盖原始文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2023-03-28
  • 2016-10-29
  • 1970-01-01
  • 2017-09-18
  • 2011-01-23
  • 2020-10-29
相关资源
最近更新 更多