使用 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
程序。简单的解释是,使用 awk
的 match
函数并在其中创建 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
例如,如果我想将下面字符串中的 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
程序。简单的解释是,使用 awk
的 match
函数并在其中创建 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