Perl 与终端中的正则表达式匹配?

And*_*son 9 regex perl terminal.app

我试图让自己稍微熟悉Perl,以便在终端(Mac) 中进行正则表达式搜索。现在,我并不是真的想认真学习 Perl,只是想找出如何做一些简单的正则表达式。

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

我希望能够在多行中匹配表达式,我将以HTML标签为例。请注意,HTML 标记只是要匹配的内容的一个示例,特别是跨越多行的内容。将 HTML 与正则表达式匹配是否是一个好主意不是问题。我只是想了解命令行中与Perl匹配的语法!

假设我想在这里匹配整个ul标签:

<ul>
 <li>item 1</li>
 <li>item 2</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我想要:

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

为了匹配,我发现了这样的东西(在我测试时,这里使用了一个简单的文本文件中的“开始”和“结束”作为示例,但请给出ul标签的示例:

perl -wnE 'say $1 if /(start(.*?)end)/' test.txt 
Run Code Online (Sandbox Code Playgroud)

这匹配一个部分,但只在一行上。令人惊讶的是,在末尾添加 s 并不能使其成为“dotall”或“单行模式”,它仍然只匹配一行......

为了更换,我尝试了这样的事情:

perl -pe 's/start(.*?)end/replacement text/'s test.txt
Run Code Online (Sandbox Code Playgroud)

这也不起作用...

bar*_*lop 20

好吧,这是一个维基百科页面,用于匹配或替换Perl oneliners。我在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
Run Code Online (Sandbox Code Playgroud)

这是另一种形式,-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 ~
$
Run Code Online (Sandbox Code Playgroud)

$ echo xxx|perl -lne 'print ""'
Run Code Online (Sandbox Code Playgroud)

Perl 等价于 \0 或 &,即整个匹配是 $_ 或能够在前后不加空格的情况下放置文本,${_}

$ echo xxx|perl -lne 'print "a${_}${_}a"'
axxxxxxa
Run Code Online (Sandbox Code Playgroud)

$  echo xxx|perl -lpe 's/.*/a${_}${_}a"/'
axxxxxxa"
Run Code Online (Sandbox Code Playgroud)

###一些进一步的例子

$ 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 ~
$
Run Code Online (Sandbox Code Playgroud)

一个全局示例-ne(将“if”更改为“while”):

$ echo -e 'bbb' | perl -0777 -ne 'print $1 while /(b)/sg'
bbb
Run Code Online (Sandbox Code Playgroud)

对于-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
Run Code Online (Sandbox Code Playgroud)

注意 -这个问题对比 /s 和 -0777

这些print $1例子没有显示整条线。这个链接 https://dzone.com/articles/perl-as-a-better-grep有这个例子 perl -wln -e "/RE/ and print;" foo.txt