Perl 正则表达式:替换 运行 个空格和换行符

Perl regexs: replace a run of spaces and newlines

文件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;'

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