bash sed/awk:替换在另一个文件中搜索的文件中字符串

bash sed/awk:替换在另一个文件中搜索的文件中字符串

我对 Debian 上的搜索和替换有疑问。我有两个文件。其中一个文件包含:

a:b
c:d
e:f

另一个是:

 e
 c
 a`

在第二个文件中,我想abcde用替换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 <(…) file2sed使用file2该临时文件作为输入(脚本)文件运行。

要将输出发送回file2,请添加一个-i选项:

sed -i -f <(sed 's!\(.*\):\(.*\)!s/\1/\2/!' file1) file2

相关内容