将 0(零)附加到 grep 匹配引用

Appending 0 (zero) to a grep match reference

tl;博士

我想在 grep 搜索的第一个反向引用 (</code>) 的末尾添加一个 <code>0。我如何将其与 thth 反向引用 (</code>).</p> 区分开来 <hr /> <p>使用 <a href="/questions/tagged/grep" class="post-tag" title="show questions tagged 'grep'" rel="tag">grep</a> in <a href="/questions/tagged/bbedit" class="post-tag" title="show questions tagged 'bbedit'" rel="tag">bbedit</a>,我想用字符串的一部分和零替换字符串的一部分。</p> <p>例如,查找并替换字符串的这一部分:</p> <pre><code>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:
y

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

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


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

编辑 这样做:

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

Replace:
0

来自手册:

If more than two decimal digits follow the backslash, only the first two are considered part of the backreference. Thus, “1” would be interpreted as the 11th backreference, followed by a literal “1”. You may use a leading zero; for example, if in your replacement pattern you want the first backreference followed by a literal “1”, you can use “1”. (If you use “”, you will get the 11th backreference, even if it is empty.)


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

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

Replace:
.0

如果您想替换此解决方法无法替换的其他内容 工作,另一个简单的解决方法是这样的:

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

First replace:
zzfoobarzz0

Second find:
zzfoobarzz

Second replace:
(empty)

其中 zzfoobarzz 是一些奇怪的字符串,在 文件。丑陋但可行。

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