0

我正在编写一个脚本来转换一些代码。我有一个执行正确转换的 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

4

1 回答 1

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
}
'

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

于 2012-10-22T20:22:57.310 回答