正则表达式仅用替换文件中的单词替换单词

Posted

技术标签:

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

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

例如: 文件 substitutes.txt 包含要替换的单词对:Good=oksat=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 【参考方案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 很高兴,我不得不补充一点,因为动态正则表达式的创建充满了潜在的瓶颈。

以上是关于正则表达式仅用替换文件中的单词替换单词的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 MySQL / 正则表达式替换器中的单词?

使用 Vim 的正则表达式替换多个文件的单词在 sed 中无法按预期工作

Python - 用正则表达式模式替换 DataFrame 中列表中的单词

如何将此正则表达式替换从替换单个单词更改为替换单词数组?

“单词正则表达式”(语义替换) - 任何示例语法和库?

仅在 Lua 中使用正则表达式替换整个单词