gpt4 book ai didi

bash - 替换多个文件中的多个字符串

转载 作者:行者123 更新时间:2023-12-04 15:56:03 25 4
gpt4 key购买 nike

我有一个包含以下格式的正则表达式和替换文字字符串列表的文件:

OLD_REGEXP_1 NEW_STRING_1
OLD_REGEXP_2 NEW_STRING_2
...

我想将多个文件 *.txt 中所有匹配 OLD_REGEXP_X 的字符串替换为 NEW_STRING_X

我相信这是一个常见问题,之前应该有人做过类似的事情,但我找不到用 bash 编写的现有解决方案。

例如:

Tom Thompson
Billy Bill&Ted
goog1e\.com google.com
https?://www\.google\.com https://google.com

输入:

Tom and Billy are visiting http://www.goog1e.com

预期输出:

Thompson and Bill&Ted are visiting https://google.com

主要挑战是:

  • 要替换的字符串由 POSIX 扩展正则表达式描述,而不是文字,以及任何不是 POSIX ERE 元字符的字符,包括 /,它通常被某些工具用作正则表达式分隔符, 必须被视为文字。
  • 替换字符串是文字,可以包含任何文字字符,包括 &\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

关于bash - 替换多个文件中的多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51608196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com