我遇到了这个名为 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 风格的正则表达式。