如何用另一个列表替换字符串列表

如何用另一个列表替换字符串列表

我有一个文件,其中有许多我想替换的字符串,所以我考虑使用一个简单的命令,如:

sed 's/string1/string2/g' file1 > out  

但是字符串太多,无法手动重复。因此,我列出了所有要替换的字符串,每行一个,并将其命名为文件 A。然后,我列出了所有替换字符串,并将其命名为文件 B。

有没有办法做类似的事情:

sed 's/line i of file A/line i of file B/g' file1 > out

文件 A 的每一行?

答案1

创建一个文件,将输入和替换字符串放在同一行(假设输入和替换字符串都不包含空格),这样会更容易。然后你可以做一些简单的事情,例如:

while read n k; do sed -i "s/$n/$k/g" file1; done < fileA

编辑:

看到 Nykakin 的回答后,我意识到你可以将他的建议与我的建议结合起来,对这两个文件做同样的事情:

paste fileA fileB | while read n k; do sed -i "s/$n/$k/g" file1; done 

答案2

这基本上是您的第一个想法,但是将替换命令放入文件中,因此它们更易于管理:

tmpfile=/tmp/Asasuser.$$
exec 3< 文件A
exec 4< 文件B
while read –r astring <&3
        读取 –r bstring <&4
        回显“s/$astring/$bstring/”>>“$tmpfile”
完毕
执行 3<&- 4<&-
sed –f "$tmpfile" 文件1 > 输出
rm –f "$tmp文件"

假设fileAfileB具有相同的行数(并且该数字大于零)并且它们都没有任何未转义的/字符。

答案3

我们只需生成所需的命令即可。假设包含列表的文件名为 lista 和 listb。然后我们可以使用:

$ for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done

为 sed 生成选项。现在我们可以将它与 eval 一起使用。假设我们的文件名为 test。我们使用:

$ eval "sed" $(for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done) "test"

答案4

paste -d : fileA fileB | sed 's/\([^:]*\):\([^:]*\)/s%\1%\2%/' > sed.script
sed -f  sed.script SOURCE-FILE

SOURCE-FILE可以是单个文件,也可以是多个文件。fileA 和 fileB 中的文本不能包含冒号或百分号字符,但可以包含空白字符。

相关内容