1

最终目标是用 ^^ 替换 ^NULL^ 的所有实例。对于这个问题,为了增加可读性,我将尝试将 ^NULL^ 替换为 ^fred^。这是我的测试数据。

/usr/redbrick_dir $ cat temp
a^NULL^b^c^
e^NULL^NULL^f^
g^h^i^NULL^

这就是我期望的工作。

/usr/redbrick_dir $ cat temp | sed "s/\^NULL\^/\^fred\^/g"
a^fred^b^c^
e^fred^NULL^f^
g^h^i^fred^

请注意,在第 2 行中,仅替换了 ^NULL^ 的第一个实例。但是,如果我只使用一个分隔符运行命令,

/usr/redbrick_dir $ cat temp | sed "s/NULL\^/fred\^/g"
a^fred^b^c^
e^fred^fred^f^
g^h^i^fred^

我得到了想要的结果。如果我只使用尾随分隔符,我也会得到这些结果。问题是,为什么这个命令只替换 ^NULL^ 的第一个实例?

cat temp | sed "s/\^NULL\^/\^fred\^/g"

编辑从这里开始

这是我尝试下面发布的几个答案时发生的情况。

cat temp | sed "s/(?<=\^)NULL(?=\^)/fred/g"
a^NULL^b^c^
e^NULL^NULL^f^
g^h^i^NULL^

cat temp | sed ":a s/\^NULL^/^fred^/;ta"
sed: 0602-417 The label :a s/\^NULL^/^fred^/;ta is greater than eight characters.

我必须查看 Utopik 提供的链接。

4

3 回答 3

2

为什么这个命令只替换 ^NULL^ 的第一个实例?

因为表达式与第二行中的第二个不匹配^NULL^,所以在表达式找到第一个之后^NULL^,它现在尝试在 之后的字符处找到匹配项^

e^NULL^ NULL^f^
       ^
   it is now trying to find a match here but there is no ^NULL^ here, there is NULL^ only.

正则表达式 101 演示

我不知道是否sed支持lookbehinds或lookaheads,但如果支持,那么我会像这样进行替换:

cat temp | sed "s/(?<=\^)NULL(?=\^)/fred/g"

或者在您的情况下fred,当然替换为空字符串。

于 2013-09-07T12:12:59.030 回答
2
There are two different scenarios:-

1) In First sed command it is like that
sed "s/\^NULL\^/\^fred\^/g" 

当它来到第二行时。它正在搜索两个字符串,因为第一个是 ^NULL^,第二个是 NULL^。所以这里是无与伦比的。正因为如此,它并没有取代它。例如 sed 如何搜索单词 Search word Replace word found ^Null^ ^fred^ Not found Null^

2) In second sed command it is like that sed "s/NULL\^/fred\^/g"

这里只搜索单词 Null^ 并替换为 fred^ 。所以它正确地匹配了这个词。

于 2013-09-07T12:55:13.733 回答
2

用 GNU sed 测试

首先,您可以删除一些反斜杠:sed "s/\^NULL^/^fred^/g"无需任何更改(^没有任何意义,但在正则表达式的开头)

然后, sed 将匹配^NULL^,并且该匹配中的任何字符都不能用于另一个匹配。所以,它不能匹配第二个^NULL^但只有NULL^,这就是它不起作用的原因。

你可以这样做:

sed ":a s/\^NULL^/^fred^/;ta"

为什么 ?因为它将替换第一个^NULL^,然后一遍又一遍地重新开始替换,直到不再发生替换,因为这是一个新的替换循环,所以每个字符都可以匹配

$ cat temp

a^NULL^b^c^
e^NULL^NULL^NULL^NULL^NULL^NULL^NULL^NULL^NULL^f^
g^h^i^NULL^

$ cat temp | sed ":a s/\^NULL^/^fred^/;ta"

a^fred^b^c^
e^fred^fred^fred^fred^fred^fred^fred^fred^fred^f^
g^h^i^fred^

没关系。

(很多好的资源:http ://sed.sourceforge.net/grabbag/tutorials/ )

于 2013-09-07T12:42:24.810 回答