【问题标题】:regex replace only words with words from replacement file正则表达式仅用替换文件中的单词替换单词
【发布时间】:2020-01-06 01:56:27
【问题描述】:

我找到了一种方法,可以将文件 inputfile.txt 中的单词替换为 bash 中 substitutes.txt 中的匹配单词与 sed

例如:
文件 substitutes.txt 包含要替换的单词对:
Good=ok
sat=cat

我使用以下代码:

sed -e 's/^/s%/' -e 's/=/%/' -e 's/$/%g/' substitutes.txt |
sed -f - inputfile.txt >outputfile.txt

这个替换有点激进,用okyear 替换Goodyear 或用saturday 替换caturday,但它应该不理会这些词。

问题来了
如何在此替换中实现单词边界 (\b),以便仅替换单词(而不是单词的一部分)?

【问题讨论】:

  • sed -e 's/^/s%\\b/' -e 's/=/\\b%/' -e 's/$/%g/' substitutes.txt

标签: regex sed


【解决方案1】:

如果您的搜索和替换列表仅包含字母单词,则只需使用 \b 单词边界将 LHS 括起来即可:

sed -e 's/^/s%\\b/' -e 's/=/\\b%/' -e 's/$/%g/' substitutes.txt
#             ^^^           ^^^

正则表达式命令列表如下所示

root@ip-172-30-0-77:/home/ubuntu# sed -e 's/^/s%\\b/' -e 's/=/\\b%/' -e 's/$/%g/' substitutes.txt
s%\bGood\b%ok%g
s%\bsat\b%cat%g

请注意,如果术语可能包含特殊字符,您可以添加更多预处理,请参阅Is it possible to escape regex metacharacters reliably with sed。然后,您还必须重新考虑将 = 作为搜索替换对之间的分隔符(多字符分隔符是更好的选择)。

【讨论】:

  • 事实上替换只包含字母词,所以你的例子效果很好。感谢您对逃跑的好提示!
  • @Kabauter 很高兴,我不得不补充一点,因为动态正则表达式的创建充满了潜在的瓶颈。
猜你喜欢
  • 2022-12-10
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多