当前位置: 首页 > 知识库问答 >
问题:

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

戎鹏云
2023-03-14

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

OLD_REGEXP_1 NEW_STRING_1
OLD_REGEXP_2 NEW_STRING_2
...

我想替换所有匹配的字符串OLD_REGEXP_XNEW_STRING_X在多个文件*. txt

我相信这是一个常见的问题,以前应该有人做过类似的事情,但我就是找不到用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元字符的字符,包括经常被一些工具用作regexp分隔符的/,都必须被视为文字。
  • 替换字符串是文字的,可以包含任何文字字符,包括字符,如

共有2个答案

赵镜
2023-03-14

考虑到您到目前为止告诉我们的内容,并考虑到评论中所说的一切以及问题中的内容,以及我能想到的所有可能的字符串,这些字符串目前未包含在您的示例中,但可能会出现(不包括包含空格的字符串-您必须告诉我们如何在mapfile中识别旧字符串和新字符串来处理这些问题),听起来这就是你需要的:

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

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

awk '
NR==FNR {
    old[NR] = $1
    gsub(/&/,RS,$2)
    new[NR] = $2
    next
}
{
    for (i=1; i in old; i++) {
        gsub(old[i],new[i])
    }
    gsub(RS,"\\&")
    print
}
' mapfile textfile
Thompson and Bill&Ted are visiting https://google.com

上面将“旧字符串”视为regexp,将“新字符串”视为不带反向引用的文本字符串,并严格按照输入文件中定义的顺序应用替换。

第一个gsub()转换每个

上面的方法可以在任何UNIX系统的任何shell中使用任何awk。

罗学真
2023-03-14

您可以将替换列表文件转换为sed脚本文件,然后让sed为您完成这项工作。

使用gnu sed尝试一下:

sed -i -f <(sed -r 's/^(\S*) (.*)/s@\1@\2@/g' listfile) *.txt
 类似资料:
  • 我想在文本文件中用新的英文字符替换突厥语字符{code>{c',c',I',I',G',G',S',S}。 这是我的密码。我在控制台上只获得原始内容,没有任何更改,也不会创建新文件。 编辑: 这是适用于我的新代码。但是我想使用一个较短的代码来替换方法。

  • 问题内容: 我正在尝试用多个其他单词替换字符串中的多个单词。字符串是“我有一只猫,一只狗和一只山羊”。 但是,它不会产生“我有一只狗,一只山羊和一只猫”,而是会产生“我有一只猫,一只猫和一只猫”。在JavaScript中是否可以同时用多个其他字符串替换多个字符串,以便产生正确的结果? 问题答案: 具体解决方案 您可以使用一个函数替换每个函数。 概括它 如果您要动态维护正则表达式并仅将将来的交换添加

  • 我正在尝试用多个其他单词替换字符串中的多个单词。绳子是“我有一只猫,一只狗,和一只山羊。” 然而,这并不产生“我有一只狗,一只山羊,一只猫”,而是产生“我有一只猫,一只猫,一只猫”。是否可以在JavaScript中同时用多个其他字符串替换多个字符串,从而产生正确的结果?

  • 问题内容: 一个非常简单的小问题,但是我不太明白该怎么做。 我需要将’_’的每个实例替换为空格,并将’#’的每个实例替换为空/空。 我已经试过了: 我真的不喜欢这样的链接命令。还有另一种方法可以做到这一点吗? 问题答案: 使用OR运算符(): 您还可以使用字符类: Fiddle 如果您想用一件事替换哈希值,而用另一件事替换下划线,则只需要链接即可。但是,您可以添加一个原型: 但是为什么不连锁呢?我

  • 我真的不喜欢这样链接命令。有没有另一种方法在一个做?

  • 问题内容: 我有一些带有以下格式的方程式的字符串。 我还有一个文本文件,其中包含每个变量的名称,例如: 等等… 什么是对我来说,写代码的最佳方式,使其在插头到处发生,并且对等? 问题答案: 对于string ,请使用以下函数: