Perl 用于在终端中与正则表达式进行匹配吗?

Perl 用于在终端中与正则表达式进行匹配吗?

我正在尝试熟悉一下Perl用于正则表达式搜索终端(Mac)。现在,我并不是真的想严格学习 Perl,只是想了解如何执行一些简单的正则表达式。

但我不知道如何在终端中做到这一点:

我希望能够匹配多行表达式,我会HTML标签作为示例。请注意,HTML 标签只是要匹配的内容的示例,特别是跨多行的内容。使用正则表达式匹配 HTML 是否是一个好主意并不是问题所在。我只是想了解在命令行上使用 Perl 进行匹配的语法!

假设我想匹配整个乌尔标记在这里:

<ul>
 <li>item 1</li>
 <li>item 2</li>
</ul>

我想:

  1. 能够在文件中匹配并将匹配结果输出到标准输出(不要问为什么,我只是想了解它是如何工作的:-))
  2. 能够用其他东西代替它。

为了匹配,我在测试时从一个简单的文本文件中发现了类似这样的内容(这里使用“开始”和“结束”作为示例,但请给出标签的示例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

相关内容