将 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”,grep 代码将如下所示:
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.
,将其排除在组之外。它不会被取代,
那样。
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”,grep 代码将如下所示:
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.
,将其排除在组之外。它不会被取代,
那样。