【问题标题】:Sed printing pattern space when there isn't a match不匹配时的 Sed 打印模式空间
【发布时间】:2023-03-25 11:45:01
【问题描述】:

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

【问题讨论】:

  • 我认为您的[A-z] 范围应该是[A-Za-z]

标签: sed


【解决方案1】:

另一种防止重复打印的方法是在最后一个打印命令之后放置d(允许您删除-n)。此外,因为您在打印之后有一个条件,您可以使用 t 命令代替,当前一个替换成功时(即. 它已经打印了一些东西)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2023-04-03
    • 1970-01-01
    • 2013-10-09
    • 2017-07-01
    • 2011-07-20
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多