文件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;'
在这里,所有前导空格都被删除(除了第一行)。无论如何,我们知道它前面必须有一条换行符。