【问题标题】:Awk find and replace for exact match onlyawk 查找和替换仅用于完全匹配
【发布时间】:2013-07-17 05:02:02
【问题描述】:

如果我想用 awk 替换字符字段,比如 {,我可以使用:

awk '{ gsub(/{/, "<"); print }' file

...但这也将替换诸如 "{" 之类的字段(我不想要)。是否有一个 awk 函数只能找到整个字段的完全匹配(和替换);适用于所有领域。

例如:

$ echo "foo bar zod \"{\" {" | awk '{ gsub(/{/, "<"); print }'

将输出:

foo bar zod "<" <

但我希望它输出:

foo bar zod "{" <

我也可以显式地遍历字段并使用 == 来检查是否完全匹配,但我想知道是否有替代方法。

【问题讨论】:

  • 请粘贴示例输入并期望输出
  • @Kent:现在已将其添加到问题中。

标签: regex replace awk


【解决方案1】:

我会照你说的做,遍历所有字段,检查==/^{$/

但是,如果我们玩一些技巧,它可以在没有循环的情况下完成:(gnu awk)

awk '$0=gensub(/(\s|^){(\s|$)/, "\\1<\\2","g")'                                                                                  

检查这个例子:

kent$ echo '{ foo "{" and this: { bar {'|awk '$0=gensub(/(\s|^){(\s|$)/, "\\1<\\2","g")'
< foo "{" and this: < bar <

在上面的示例中,替换了 4 个 { 中的 3 个。

【讨论】:

  • 很好,^ 和 $ 分别匹配字符串的开头和结尾;当搜索的字符前面或后面没有空格时。 gensub 的第一个参数中的 { 不对应 \\2 因为它不在括号内。
猜你喜欢
  • 2012-12-06
  • 2021-09-09
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多