关于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
答案 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
$
如果您收到不同的内容,则表示您没有在您正在编辑的文件中显示问题中显示的相同数据。如果你期待不同的东西,你需要解释你的期望和原因,因为我认为这是一个误解。