我们如何使用反向引用在Perl中编写正则表达式

时间:2017-08-28 14:45:37

标签: regex perl

我正在尝试在一个班轮代码中使用匹配的字符串来引用引用。以下是样本记录。请一些人帮忙。谢谢。

样本记录:

  

127.0.0.11 [28 / Aug / 2017:12:23:21]

perl -pe 's/^(\d+.\d+.\d+.\d+)( *$)/\1__/' samplefile.txt

这里我希望输出为:

127.0.0.11__

3 个答案:

答案 0 :(得分:1)

$ cat samplefile.txt
127.0.0.11 [28/Aug/2017:12:23:21 ]
127.0.0.11 [28/Aug/2017:12:23:22 ]
127.0.0.11 [28/Aug/2017:12:23:23 ]
127.0.0.11 [28/Aug/2017:12:23:24 ]

要使用的正则表达式:

^(\d+\.\d+\.\d+\.\d+)            # matching ip-address
.*                               # 0 or more characters

使用捕获变量$ 1复制ip-address,然后按' __':

$ perl -pe 's/^(\d+\.\d+\.\d+\.\d+).*/$1__/' samplefile.txt
127.0.0.11__
127.0.0.11__
127.0.0.11__
127.0.0.11__

答案 1 :(得分:1)

您的代码存在的问题是它需要一个IP地址,后跟可选空格,后跟行尾。但您的实际数据包含其他其他文字([28/Aug/2017:12:23:21 ])。

您可以这样做:

perl -pe 's/^(\d+\.\d+\.\d+\.\d+).*/$1__/' samplefile.txt

.*匹配该行上的任何剩余文字。

此外,您不希望在此处进行反向引用:反向引用看起来像\1,并且是正则表达式语法的一部分。但替换的右手边不是正则表达式,它是一个双引号字符串。在成功进行正则表达式匹配后,您可以使用捕获变量$1$2,...来引用匹配的子字符串。

答案 2 :(得分:0)

你快到了。您错过了将.放在*之前的第二个字符集中。

您可以尝试以下任一代码。

perl -pe 's/^(\d+.\d+.\d+.\d+)(.*$)/\1__/' text.txt 

perl -pe 's/^(\d+\.\d+\.\d+\.\d+)(\s)(.*)/\1__/' text.txt

两者都会给你想要的结果。

text.txt的内容

127.0.0.11 [28/Aug/2017:12:23:21 ]
127.0.0.112 [28/Aug/2017:12:23:21 ]
127.0.0.13 [28/Aug/2017:12:23:21 ]
127.0.0.4 [28/Aug/2017:12:23:21 ]

输出

127.0.0.11__
127.0.0.112__
127.0.0.13__
127.0.0.4__
相关问题