使用sed替换找到的第二个模式

时间:2015-08-29 10:16:29

标签: bash sed

如何使用sed替换找到的第二个模式?

<default>...</default>
<default>...</default>
<default>...</default>

<setting id="lookandfeel.font" type="string" parent="lookandfeel.skin" label="13303" help="36107">
      <level>1</level>
      <default>Default</default>
</setting>

<default>...</default>
<default>...</default>
<default>...</default>

first pattern = lookandfeel.font

第二种模式=默认

然后将“Default”替换为“Arial”

3 个答案:

答案 0 :(得分:2)

使用GNU sed:

sed '/<setting id="lookandfeel.font"/,/<\/setting>/{s|<default>Default</default>|<default>Arial</default>|}' file

如果您想“编辑”,请添加选项-i

答案 1 :(得分:0)

sed用于单个行上的简单替换,即全部。对于任何更有趣的东西,你应该使用awk的清晰度,简洁性,稳健性,可移植性,可维护性以及几乎所有其他理想的软件质量:

$ awk '/lookandfeel.font/{f=1} f&&sub(/Default/,"Arial"){f=0} 1' file
<default>...</default>
<default>...</default>
<default>...</default>

<setting id="lookandfeel.font" type="string" parent="lookandfeel.skin" label="13303" help="36107">
      <level>1</level>
      <default>Arial</default>
</setting>

<default>...</default>
<default>...</default>
<default>...</default>

答案 2 :(得分:-1)

Perl

中考虑此正则表达式
s/(lookandfeel\.skin[\S\s]*)Default/$1Arial/gm

请参阅:DEMO

根据this questionthis question告诉sed难以处理多行模式,我建议您使用perl代替sed

注意如果您想要更严格的正则表达式,请在您的问题中添加更多信息。