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

Bash 将一个文件的字符串替换为另一个文件的字符串以进行匹配,bash,awk,sed,grep,Bash,Awk,Sed,Grep,我有一个文件comp.pkglist,其中提到了软件包版本和发行版。两个字段'version change'和'release change'分别包含两个版本,格式为'old'-->'new' Version Change: <old version> --> <new version> Release Change: <old version> --> <new version> 对于每个包名,我需要在/tmp目录中搜索,并将其版本

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

Version Change: <old version> --> <new version>
Release Change: <old version> --> <new version>
对于每个包名,我需要在
/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
下任何文件中的旧版本替换为新版本,并将旧版本替换为新版本

您还没有提供预期的输出,此sed将在所有
-->
行上放置新版本:

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


一般来说,希望你自己解决问题,但在路上寻求帮助。您似乎指定了一个问题并要求实现。请描述为解决此问题所做的工作以及您的困难所在。package tzdata 2018e 3.el6 arch noarch在/tmp目录中搜索“tzdata”时,我在文件/tmp/core.pkglist中找到了上述条目,现在我想要的是:package tzdata 2018g 1.el6 arch noarch。它应该从源文件ie.comp.pkglist中获取2018g和1.el6值,并在文件/tmp/core.pkglistNice中编辑。对于那些讨厌倾斜牙签综合症的人,你可以使用
-E
扩展语法,并将其简化为
sed-iE的/[^]{1,}-->(.{1,})$/\1/'
甚至
sed-iE的/[^]+-->(.+)$/\1/'
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