我正在尝试在一个班轮代码中使用匹配的字符串来引用引用。以下是样本记录。请一些人帮忙。谢谢。
样本记录:
127.0.0.11 [28 / Aug / 2017:12:23:21]
perl -pe 's/^(\d+.\d+.\d+.\d+)( *$)/\1__/' samplefile.txt
这里我希望输出为:
127.0.0.11__
答案 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__