将文件的字符串替换为另一个文件的字符串以进行匹配

时间:2018-11-28 08:53:30

标签: bash awk sed grep

我有一个文件comp.pkglist,其中提到了软件包的版本和发行版。两个字段'version change''release change'包含两个格式为'old' --> 'new'的版本。

Version Change: <old version> --> <new version>
Release Change: <old version> --> <new version>
$ cat comp.pkglist
Package list:   nss-util-devel-3.28.4-1.el6_9.x86_64
Version Change: 3.28.4 --> 3.36.0
Release Change: 1.el6_9 --> 1.el6

Package list:   tzdata-2018e-3.el6.noarch
Version Change: 2018e --> 2018g
Release Change: 3.el6 --> 1.el6

对于每个软件包名称,我需要在/tmp目录中进行搜索,并将其版本从旧版本替换为新版本,并将旧版本替换为新版本:

$ grep -ri -n tzdata /tmp/.
/tmp/core.pkglist:578:package tzdata                  2018e       3.el6    arch noarch

$ sed -i '578s/2018e/2018g/' /tmp/core.pkglist   # To replace '2018e by 2018g in 578th line.

如何使它在comp.pkglist文件中的所有软件包中起作用,以将其旧版本替换为新版本,并在目录/tmp下的任何文件中将旧版本替换为新版本。

1 个答案:

答案 0 :(得分:1)

无论如何,您仍未提供预期的输出,此sed将以新版本放置在所有-->行中:

sed -i 's/[^ ]\{1,\} --> \(.\{1,\}\)$/\1/'

测试:

$ cat comp.pkglist
Package list:   nss-util-devel-3.28.4-1.el6_9.x86_64
Version Change: 3.28.4 --> 3.36.0
Release Change: 1.el6_9 --> 1.el6

Package list:   tzdata-2018e-3.el6.noarch
Version Change: 2018e --> 2018g
Release Change: 3.el6 --> 1.el6

$ sed 's/[^ ]\{1,\} --> \(.\{1,\}\)$/\1/' comp.pkglist
Package list:   nss-util-devel-3.28.4-1.el6_9.x86_64
Version Change: 3.36.0
Release Change: 1.el6

Package list:   tzdata-2018e-3.el6.noarch
Version Change: 2018g
Release Change: 1.el6