我有一个文件,其中有许多我想替换的字符串,所以我考虑使用一个简单的命令,如:
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文件"
假设fileA
和fileB
具有相同的行数(并且该数字大于零)并且它们都没有任何未转义的/
字符。
答案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 中的文本不能包含冒号或百分号字符,但可以包含空白字符。