我的输入文件看起来像这样
Start1
some text
that I want
modified
Pattern1
some other text
which I do not want
to modify
End1
Start1
Pattern2
End1
我的sed模式看起来像这样
/Start1/,/Pattern1/c\
Start1\
Modification text here\
Pattern1\
additional modifications
我只想修改Start1
和End1
的第一个范围内的文字。
另外,我还指定了Pattern1
,它在第二个范围内不存在。
我跑
sed -i -f <sed_file> <input_file>
但是,我的输出如下。由于某种原因,即使Pattern1
中不存在Start1
Modification text here
Pattern1
additional modifications
some other text
which I do not want
to modify
End1
,它也会清除第二个范围。
Start1
Modification text here
Pattern1
additional modifications
some other text
which I do not want
to modify
End1
Start1
Pattern2
End1
预期结果
someArrayList.remove(integerKeyLocation.intValue());
答案 0 :(得分:0)
试试这个
sed ':A;/Start1/!b;N;/Pattern1/!bA;s/\(Start1\n\)\(.*\)\(\nPattern1\)/\1Modification text here\3\nadditional modifications/' infile
答案 1 :(得分:0)
在GNU sed中:
sed -e '/START/,/END/c TEXT
与
不同sed -e '/START/,/END/{c TEXT' -e '}'
第一个将开始从输出流中省略范围,并在到达范围的末尾时将TEXT
的一个实例发送到输出字符串中。第二行将用TEXT
替换范围中的每一行。
您的问题是,即使您从未到达第二个范围的末尾,也会从输出流中省略第二个范围。 /START/,/END/c
永远不会出现的/END/
基本上就像/START/,$d
我能想到的唯一解决方案是笨重的:
/Start1/,/Pattern1/{ /Pattern1/{ # Insert into output stream i\ Start1\ Modification text here\ Pattern1\ additional modifications # Read in the rest of the file :a $!N $!ba # Remove the original Pattern1 line from the pattern space # (Remove first line and newline of pattern space) s/^[^\n]*\n// # Print pattern space and quit q } # Delete lines in the range other than /Pattern1/ d }