如何使用ssed(Super sed)的多行修饰符?

如何使用ssed(Super sed)的多行修饰符?

我遇到了这个名为 ssed 的工具,它支持 Perl 的正则表达式模式,并且是 sed 的大幅增强版本:https://launchpad.net/ssed/

这个命令似乎不起作用:

printf 'a\nBc\n' | ssed -R 's/a(?m)\nBc\n/X\n/'

我预计输出是:

X

但它打印:

a
Bc

我知道我可以使用 perl 进行多行处理,但我目前想探索 ssed 可用的选项。

编辑:这是来自启动板页面:

(7) Perl-style regular expressions, with examples. Use the -R switch.
    Used in /addressing/ or the FIND side of s/// commands.

  (?i)abc - case-insensitive match of abc, ABC, aBc, ABc, etc.
  ab(?i)c - same as above; the (?i) applies throughout the pattern
  (ab(?i)c) - matches abc or abC; the outer parens make the difference!
  (?m) - multi-line pattern space: same as "s/FIND/REPL/M"

注意:我正在尝试模拟这个 perl 命令

 seq 10 | perl -p0e 's/\n/:/g'

输出:

1:2:3:4:5:6:7:8:9:10:

答案1

但在开始匹配之前,您必须先准备好多行模式空间——这只能通过 N/G/H 命令来实现。现在模式空间一次一行。

Ssed 并不是披着 sed 外衣的 Perl,但它只是实现了 Perl 的正则表达式功能。至于 Perl -0pe 命令,如果 -z 选项可用,您可以尝试,否则您总是可以这样做

seq 10 |
ssed -e '
  :loop
  $!{
    N
    b loop
  }
  G
  s/\n/:/g
'
1:2:3:4:5:6:7:8:9:10:

在职的:

  • N 命令将下一行追加到模式空间。
  • 在循环中,我们应用 N 命令,很快所有行都在模式空间中,并且每行都通过换行符与下一行分隔。
  • 然后,当文件耗尽时,这意味着我们已经到达 eof,我们用冒号替换每个换行符。
  • G 命令将保留空间附加到模式空间,这意味着将换行符附加到模式空间。

请注意,由于此处不涉及 Perl 风格的正则表达式,因此不需要 -R 选项。但是模式空间是多行的,因为我们已将整个数据读入模式空间。这意味着,您现在可以在这个模式空间上尝试 Perl 风格的正则表达式。

相关内容