我正在尝试使自己熟悉Perl,以便在Terminal(Mac)中进行正则表达式搜索。现在,我并不是真的想严格地学习Perl,只是试图找出如何执行一些简单的正则表达式。
但是我不知道如何在终端中做到这一点:
我希望能够在多行上匹配表达式,以HTML标记为例。请注意,HTML标记只是要匹配的东西的一个示例,特别是跨越多行的东西。将HTML与正则表达式匹配是否是一个好主意,不是问题。我只想在命令行上了解与Perl匹配的语法!
假设我要在此处匹配整个ul标签:
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
我想要:
为了进行匹配,我在测试时从一个简单的文本文件中找到了类似的内容(此处以“开始”和“结束”为例,但请提供ul
标签的示例:
perl -wnE 'say $1 if /(start(.*?)end)/' test.txt
这匹配一部分,但仅在一行上。令人惊讶的是,在末尾添加s不能使其变为“ dotall”或“单行模式”,它仍然只匹配一行...
为了进行替换,我尝试了如下操作:
perl -pe 's/start(.*?)end/replacement text/'s test.txt
这也不起作用...
好吧,这是一个维基百科页面,用于匹配或替换Perl one的衬纸。我在Cygwin中做到了:
Perl的行为类似于grep或sed。
该/s
品牌匹配点新的生产线。
将-0777
使得应用正则表达式来整个事情,而不是一行行。
\n
也可以匹配新行。
$ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//s'
d
user@comp ~
$ echo -e 'a\nb\nc\nd' | perl -pe 's/.*c//s'
a
b
d
这是另一种形式,-ne
具有print $1
:
user@comp ~
$ echo -e 'a\nb\nc\nd' | perl -ne 'print $1 if /(.*c)/s'
c
user@comp ~
$ echo -e 'a\nb\nc\nd' | perl -0777 -ne 'print $1 if /(.*c)/s'
a
b
c
user@comp ~
$
还
$ echo xxx|perl -lne 'print ""'
Perl等于\ 0或&,即整个匹配为$ _,或者为了能够在文本前后插入空格而没有空格,则$ {_}
$ echo xxx|perl -lne 'print "a${_}${_}a"'
axxxxxxa
和
$ echo xxx|perl -lpe 's/.*/a${_}${_}a"/'
axxxxxxa"
###一些其他示例
$ cat t.t
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
$ perl -0777 -ne 'print $1 if /\<ul\>(.*?)\<\/ul>/s' t.t
<li>item 1</li>
<li>item 2</li>
user@comp ~
$ perl -0777 -ne 'print $1 if /(.*)/s' t.t
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
user@comp ~
$
一个示例的全局示例-ne
(将“ if”更改为“ while”):
$ echo -e 'bbb' | perl -0777 -ne 'print $1 while /(b)/sg'
bbb
对于-pe
一个,只需g
在末尾添加/sg
或/gs
(相同的东西):
$ echo -e 'aaa' | perl -0777 -pe 's/a/z/s'
zaa
user@comp ~
$ echo -e 'aaa' | perl -0777 -pe 's/a/z/sg'
zzz
注意-此问题与/ s和-0777相反
这些print $1
示例未显示全部内容。此链接https://dzone.com/articles/perl-as-a-better-grep具有此示例perl -wln -e "/RE/ and print;" foo.txt
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句