Perl正则表达式:替换一系列空格和换行符



文件bar的空白仅由空格和换行符组成:

$ cat bar
1, 2,
  3,
4

我想用S替换连续运行的空白(空格和换行),即所需的输出是:

1,S2,S3,S4S

然而,我所有的尝试都导致n被一个S取代,紧接着它的空格被另一个S:取代

$ cat bar | perl -pe 's/s+/S/g'
1,S2,SS3,S4S
$ cat bar | perl -pe 's/s+/S/gm'
1,S2,SS3,S4S
$ cat bar | perl -pe 's/s+/S/gms'
1,S2,SS3,S4S
$ cat bar | perl -pe 's/[ n]+/S/gms'
1,S2,SS3,S4S
$ cat bar | perl -pe 's/[ n]+/S/gm'
1,S2,SS3,S4S
$ cat bar | perl -pe 's/[ n]+/S/g'
1,S2,SS3,S4S

这些都是我能想到的相关正则表达式标志的组合:/g(全局替换)、/s(让.与换行符匹配)和/m(多行);我总是在3之前有SS,我只想要S

任何帮助都将不胜感激!

perl -p逐行读取输入。您需要一次读取整个输入,或者记住前一行是否以空白结尾。

perl -0777 -pe 's/s+/S/g'

-0777一次读取整个文件。

perl -pe 's/^s+// unless 1 == $.; s/s+/S/g;'

在这里,所有前导空格都被删除(除了第一行)。无论如何,我们知道它前面必须有一条换行符。

最新更新