我对 Debian 上的搜索和替换有疑问。我有两个文件。其中一个文件包含:
a:b
c:d
e:f
另一个是:
e
c
a`
在第二个文件中,我想a
用b
、c
用d
、e
用替换f
。我该怎么做?
答案1
$ awk -F: 'FNR==NR{a[$1]=$2;next} {for (i in a)sub(i, a[i]);print}' file1 file2
f
d
b
怎么运行的
-F:
这告诉
awk
在冒号上拆分字段。FNR==NR{a[$1]=$2;next}
在读取第一个文件时,这会告诉我们要创建要进行的翻译的
awk
词典。a
for (i in a)sub(i, a[i])
在读取第二个文件 file 时,这会告诉
awk
用 替换我们存储在字典中的每个条目a
。print
在我们完成替换之后,这会告诉
awk
打印该行。
替换 file2
要替换file2
为新版本:
awk -F: 'FNR==NR{a[$1]=$2;next} {for (i in a)sub(i, a[i]);print}' file1 file2 >tmp && mv tmp file2
在 的最新版本中awk
,有一个快捷选项:-i inplace
。但从表面来看,此选项的作用与上述命令完全相同。
答案2
稍微复杂一点:
sed -f <(sed 's!\(.*\):\(.*\)!s/\1/\2/!' file1) file2
sed 's!\(.*\):\(.*\)!s/\1/\2/!' file1
读取第一个文件并输出:s/a/b/ s/c/d/ s/e/f/
<(the_above)
运行上述命令并将输出到临时文件。sed -f <(…) file2
sed
使用file2
该临时文件作为输入(脚本)文件运行。
要将输出发送回file2
,请添加一个-i
选项:
sed -i -f <(sed 's!\(.*\):\(.*\)!s/\1/\2/!' file1) file2