当没有匹配时,Sed打印图案空间

时间:2012-10-22 20:03:01

标签: sed

我正在编写一个脚本来转换一些代码。我有一个sed命令执行正确的转换,但我需要使用-n命令来防止自动打印模式空间以抑制双重打印。然而,这会阻止打印我想要输出的任何其他行。这是我正在使用的脚本。

sed -i -r 's/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{/ class \4 extends \5 { /p
/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,/ {
N
s/ *\n/ /
s/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{*/ class \4 extends \5 { \
/p
}
'

可以在此处找到测试输入文件:https://www.dropbox.com/s/h9vly1hwtqtl8te/TestText.txt 可以在此处找到脚本中具有/不具有-n开关的两个不同结果:https://www.dropbox.com/s/f0g8horafwial1x/TestText.txt.ts_result1.txt 在这里:https://www.dropbox.com/s/ekualxj7foapgml/TestText.txt.ts_result2.txt 在此处找到了所需的结果:https://www.dropbox.com/s/3510oh899fh0ji2/TestText.txt.ts_resultdesired.txt

是否有可能获得所需的结果?

我正在跑步 $ sed --version GNU sed版本4.2.1

1 个答案:

答案 0 :(得分:0)

防止双重打印的另一种方法是在最后一个打印命令后放置d(允许您删除-n)。此外,因为您在打印后有条件,所以您可以使用t命令,该命令将分支到标签(在本例中为done命令之前的d标签)以前的替代成功(即它已经打印了一些东西)。

sed -i -r 's/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{/ class \4 extends \5 { /p
/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,/ ! t done
/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,/ {
N
s/ *\n/ /
s/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{*/ class \4 extends \5 { \
/p
: done
d
}
'

(注意:虽然没有测试过......)