我正在尝试熟悉一下Perl用于正则表达式搜索终端(Mac)。现在,我并不是真的想严格学习 Perl,只是想了解如何执行一些简单的正则表达式。
但我不知道如何在终端中做到这一点:
我希望能够匹配多行表达式,我会HTML标签作为示例。请注意,HTML 标签只是要匹配的内容的示例,特别是跨多行的内容。使用正则表达式匹配 HTML 是否是一个好主意并不是问题所在。我只是想了解在命令行上使用 Perl 进行匹配的语法!
假设我想匹配整个乌尔标记在这里:
<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
这也不起作用...
答案1
嗯,这里有一个用于匹配或替换的维基百科页面Perl 单行代码。我这样做了赛格威:
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