3

tl;博士

我想在grep 搜索0的第一个反向引用 ( ) 的末尾添加一个。\1我如何才能将其与第十个反向引用 ( \10) 区分开来。


中使用,我想用字符串的一部分和零替换字符串的一部分。

例如,查找并替换字符串的这一部分:

195.22.126.x

在这个字符串中:

195.22.126.x - - [13/Jul/2018:19:16:49 -0200] "GET /file.txt HTTP/1.1" 301 243

带有字符串的那部分的一部分和一个零:

195.22.126.0

如果我想用“y”替换字符串那部分末尾的“x”,则代码将如下所示:

Find:
^(\d+\.\d+\.\d+\.)x

Replace:
\1y

但是,如果我想用“0”(零)替换“x”,程序会尝试提取第十个匹配项,而不是在第一个匹配项上附加一个零,因为\10它看起来像“第十个匹配项”,而不是“第一场比赛和一个零”。

那么如何将零附加到 grep 匹配项?


请注意,我不能简单地将“x”替换为“0”,因为字符串中还有其他“x”。因此我必须匹配字符串的正确部分。

4

1 回答 1

1

编辑这样做:

Find:
^(\d+\.\d+\.\d+\.)x

Replace:
\010

从手册:

如果反斜杠后跟多于两位十进制数字,则只有前两位被视为反向引用的一部分。因此,“\111”将被解释为第 11 个反向引用,后跟文字“1”。您可以使用前导零;例如,如果在替换模式中您想要第一个反向引用后跟文字“1”,则可以使用“\011”。(如果你使用“\11”,你会得到第 11 个反向引用,即使它是空的。)


好吧,如果这是您要使用的实际字符串,有一个简单的解决方案:只需将最后一个点移出组。

Find:
^(\d+\.\d+\.\d+)\.x

Replace:
\1.0

如果您想替换此解决方法不起作用的其他东西,另一个简单的解决方法是这样的:

First find:
^(\d+\.\d+\.\d+\.)x

First replace:
\1zzfoobarzz0

Second find:
zzfoobarzz

Second replace:
(empty)

zzfoobarzz文件中无处出现的奇怪字符串在哪里。丑陋但可行。

另一个想法是使用后向断言来匹配 195.22.126.,将其排除在组之外。那样就不会被取代了。

于 2018-07-13T21:18:09.810 回答