这两个正则表达式是否可以给出不同的结果?
perl -pe 's/.*c//s'
perl -0777 -pe 's/.*c//s'
.*c
可以替换为任何内容..
在.*c
案例中,结果是相同的
$ echo -e 'a\nb\nc\nd' | perl -pe 's/.*c//s'
a
b
d
$ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//'
a
b
d
问题是正则表达式之间的区别,回声的东西也可以用任何东西代替。
-0777
和/s
是否可以互换?
使用-0777
同时执行/s
是否毫无意义?
答案 0 :(得分:3)
它们意味着完全不同的东西,并且不可互换,即使在某些情况下它们可以具有相同的结果。
/s
使.
匹配所有字符(包括换行符);没有它.
通常意味着[^\n]
-0777
表示立即读取整个文件;如果没有它,则逐行读取文件 /s
不会更改解析输入的方式,-0
会这样做。
-0777
通常仅在您跨多行匹配时才有用(在这种情况下/s
可能会有所帮助)。如果您逐行匹配,那么您是否使用/s
并不重要。
例如(使用您的示例),如果您要删除最后c
之前的所有内容,包括所有行,您可以使用:
echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//s'
输出:
d
答案 1 :(得分:2)
Qtax给出了一个很好的答案,我只是想举一些例子来证明它们不一样,甚至不一样。
这两个
$ echo -e 'a\nb\nc\nd' | perl -pe 's/./o/s'
o
o
o
o
$ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/./o/'
o
b
c
d
这两个
$ echo -e 'aa\nbb\ncc\ndd' | perl -0777 -pe 's/./o/'
oa
bb
cc
dd
$ echo -e 'aa\nbb\ncc\ndd' | perl -pe 's/./o/s'
oa
ob
oc
od
这两个
$ echo -e 'aa\nbb\ncc\ndd' | perl -pe 's/./o/sg'
oooooooooooo
$ echo -e 'aa\nbb\ncc\ndd' | perl -0777 -pe 's/./o/g'
oo
oo
oo
oo
这些都表明-0777和/ s不一样。