sed和替换+不替换第二个字符串

时间:2018-04-29 02:37:37

标签: sed

关于sed没有替换第二个字符串的快速提问。

我有两个数据块; sed将替换第一个数据块,但它不会取代或替换某些第二个数据字符串。

first block of data
abcd_0000001=/var/tmp /0000001
abcd_0000001=Y
abcd_0000001=
abcd_0000001=[A-za-z]*.*
abcd_0000001=/tmp/
abcd_0000001=1
abcd_0000001=true
abcd_0000001=pwd
abcd_0000001=scp
abcd_0000001=

second block of data
74747_cnn=/opt/0000001
74747_cnn=
74747_cnn=pwd
74747_cnn=1
74747_cnn=/
74747_cnn=/usr
74747_cnn=/usr/74747_cnn7
74747_cnn=
74747_cnn=scp
74747_cnn=true

如果我想将abcd_0000001替换为defg_0000077,将74747_cnn替换为19197_abc,将0000001替换为0000001AJC,则...

sed将替换第一个数据块,并将替换第二个数据块中的一些文本。 它会将cnn替换为_abc,但不会取代74747。 我错过了什么或做错了什么?

我使用以下内容:

sed -i 's/abcd_0000001/defg_0000077/g; s/74747_cnn/19197_abc/g; s/0000001/0000001AJC/g' file.txt

1 个答案:

答案 0 :(得分:0)

使用BSD或GNU sed,将-i替换为-e(因此数据文件未被修改已修改且可以重复使用 - 不要使用像-i这样的破坏性选项,直到你知道一切正常,为了你自己的理智!),我可以执行你显示的命令并从两个获得相同的输出,像这样:

first block of data
defg_0000077=/var/tmp /0000001AJC
defg_0000077=Y
defg_0000077=
defg_0000077=[A-za-z]*.*
defg_0000077=/tmp/
defg_0000077=1
defg_0000077=true
defg_0000077=pwd
defg_0000077=scp
defg_0000077=

second block of data
19197_abc=/opt/0000001AJC
19197_abc=
19197_abc=pwd
19197_abc=1
19197_abc=/
19197_abc=/usr
19197_abc=/usr/19197_abc7
19197_abc=
19197_abc=scp
19197_abc=true

AFAICS,这已经完成了您在两个数据块中请求的所有替换。这不是您期望的输出吗?您的输出与此有何不同?

$ /opt/gnu/bin/sed -e 's/abcd_0000001/defg_0000077/g; s/74747_cnn/19197_abc/g; s/0000001/0000001AJC/g' data > gnu.out
$ /usr/bin/sed -e 's/abcd_0000001/defg_0000077/g; s/74747_cnn/19197_abc/g; s/0000001/0000001AJC/g' data > bsd.out
$ diff bsd.out gnu.out
$ cat
first block of data
abcd_0000001=/var/tmp /0000001
abcd_0000001=Y
abcd_0000001=
abcd_0000001=[A-za-z]*.*
abcd_0000001=/tmp/
abcd_0000001=1
abcd_0000001=true
abcd_0000001=pwd
abcd_0000001=scp
abcd_0000001=

second block of data
74747_cnn=/opt/0000001
74747_cnn=
74747_cnn=pwd
74747_cnn=1
74747_cnn=/
74747_cnn=/usr
74747_cnn=/usr/74747_cnn7
74747_cnn=
74747_cnn=scp
74747_cnn=true
$

如果您收到不同的内容,则表示您没有在您正在编辑的文件中显示问题中显示的相同数据。如果你期待不同的东西,你需要解释你的期望和原因,因为我认为这是一个误解。