sed и замена + не замена второй строки - PullRequest
0 голосов
/ 29 апреля 2018

Быстрый вопрос о 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 голосов
/ 29 апреля 2018

Используя либо 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
$

Если вы получаете что-то другое, это означает, что у вас нет тех данных, которые указаны в вопросе в редактируемом файле. Если вы ожидаете чего-то другого, вам нужно объяснить, чего вы ожидаете и почему, потому что я считаю, что есть недоразумение.

...