我有一个包含正则表达式列表和替换文字字符串的文件,格式如下:
OLD_REGEXP_1 NEW_STRING_1
OLD_REGEXP_2 NEW_STRING_2
...
我想替换所有匹配的字符串OLD_REGEXP_X
with NEW_STRING_X
在多个文件中*.txt
.
我相信这是一个常见的问题,之前应该有人做过类似的事情,但我只是找不到用 bash 编写的现有解决方案。
例如 :
Tom Thompson
Billy Bill&Ted
goog1e\.com google.com
https?://www\.google\.com https://google.com
Input :
Tom and Billy are visiting http://www.goog1e.com
预期输出:
Thompson and Bill&Ted are visiting https://google.com
主要挑战是:
- 要替换的字符串由 POSIX 扩展正则表达式描述,而不是文字,以及任何不是 POSIX ERE 元字符的字符,包括
/
某些工具经常将其用作正则表达式分隔符,必须将其视为文字。
- 替换字符串是文字的,可以包含任何文字字符,包括类似的字符
&
and \1
通常用作替换字符串中的反向引用元字符,但在这种情况下必须是文字。
- 替换必须按照它们在映射文件中出现的顺序进行,因此如果我们在映射文件中按该顺序有 A->B 和 B->C,并且 A 出现在要更改的文本文件中,则输出将包含“C”代替“A”,而不是“B”。
您可以将替换列表文件转换为sed
脚本文件,然后让sed
为你做这份工作。
使用 gnu sed 尝试一下:
sed -i -f <(sed -r 's/^(\S*) (.*)/s@\1@\2@/g' listfile) *.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)