使用 awk(或 sed)替换特定组

Using awk(or sed) to replace specific group

例如,如果我想将下面字符串中的 424 或任何数字更改为 1。

<revision>424</revison>

我经常这样做 sed -i 's|<revision>.*</revision>|<revision>777</revision>|g 并且有效。

但是我必须执行很多类似的命令
我想知道我是否可以像 <revision>(.*)</revision> 那样分组并仅将 </code> 替换为 <code>777。我该怎么做?

使用 gnu-sed,您可以在模式匹配中使用捕获组的 back-reference,例如:

s='<revision>424</revision>'

sed -E 's~<(revision)>[0-9]*</>~<>777</>~g' <<< "$s"
<revision>777</revision>

但是,如果您想给 perl 一个机会,那么您甚至可以使用 look around assertions:

进一步缩短它
perl -pe 's~(?<=<(revision)>)\d*(?=</>)~777~g' <<< "$s"
<revision>777</revision>

使用 GNU awk 和您显示的示例,请尝试以下 awk 程序。简单的解释是,使用 awkmatch 函数并在其中创建 4 个捕获组,其中第一组捕获 <revision>,第二组捕获所有数字,第三组捕获 <\/revison>和第四个(如果有任何其他值)一切。如果此匹配函数为真,则打印 arr 的第一个元素,然后是 newVal(包含新值的 awk 变量),然后是 arr 的第三个和第四个元素值。

awk -v newVal="777" '
match([=10=],/(<revision>)([0-9]+)(<\/revison>)(.*)/,arr){
  print arr[1] newVal arr[3] arr[4]
}
'  Input_file