使用sed

时间:2015-09-06 13:36:51

标签: regex bash replace sed

大家好我有以下代码

  找到。 -type f -exec sed -i的@ EText-No。@新的EText-No。 @g'{} +

我一直在使用该脚本来查找和替换文件夹和子文件夹中多个文件中的某些字符。 我发现有些值出现的次数超过两次。因此,我需要修改我的脚本以仅替换属性的第二个实例

  找到。 -type f -exec sed -i'/Subject/ {:a; N; /Subject.*Subject /!Ta;s/Subject/SecondSubject/2;}/g'{} +

我正在尝试使用上面的代码来实现这个......但它似乎没有起作用。我需要修改代码以使用“@”作为上述代码之类的单独的代码。因为我的文件中有反冲字符。 任何想法我如何使代码工作和使用sperator @?

感谢您的帮助

处理前的原始文件

<tr><th scope="row">Subject</th><td>United States -- Biography</td></tr><tr><th scope="row">Subject</th><td>United States -- Short Stories</td></tr><tr><th scope="row">EText-No.</th><td>24200</td></tr><tr><th scope="row">Release Date</th><td>2008-01-07</td></tr><tr>

处理后

<tr><th scope="row">Subject</th><td>United States -- Biography</td></tr><tr><th scope="row">SecondSubject</th><td>United States -- Short Stories</td></tr><tr><th scope="row">EText-No.</th><td>24200</td></tr><tr><th scope="row">Release Date</th><td>2008-01-07</td></tr><tr>

请注意,第二个主题已从“主题”更改为“SecondSubject”

1 个答案:

答案 0 :(得分:0)

试试这个:

sed -i '/Subject/{:a;s/\(Subject.*\)Subject/\1SecondSubject/;tb;N;ba;:b}'

如果附加到模式空间的行(使用N命令)包含多个单词&#34; Subject&#34;,则可以使用此命令仅定位第一次出现的附加行(第二次出现模式空间):

sed -i '/Subject/{:a;/Subject.*Subject/!{N;ba;};s/Subject/newSubject/2;}'