sed строка заменяет все слово, если часть строки совпадает, но не влияет на слова после строки - PullRequest
0 голосов
/ 07 января 2019

У меня есть эта строка:

password requisite pam_cracklib.so difok=355 abcd

Как заменить "difok = 355" на "difok = 8"?
Значение 355 может быть любым.
В основном заменить "difok = X" на "difok = 8".

Я пробовал это:

sed -i '/^#/!s/difok=.*/difok=8/g' temp

Но это заменяет любой текст после "difok ="
Я попробовал:

sed -i '/^#/!s/\bdifok=*\b/difok=8/g' temp

Это дает "difok = 8355".

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Я бы, наверное, сделал это так:

sed -i 's/difok=[^ ]*/difok=8/' temp

Первая половина команды замены соответствует difok=, за которым следует любое количество символов, не являющихся пробелами.

0 голосов
/ 08 января 2019

С sed:

echo "password requisite pam_cracklib.so difok=355 abcd" |sed -E -n 's/(.* )(difok=[0-9]+)(.*)/\1difok=8\3/p'

Выход:

password requisite pam_cracklib.so difok=8 abcd
0 голосов
/ 07 января 2019

С GNU sed и расширенными регулярными выражениями (-r):

sed -r -i 's/(difok=)[0-9]+/\18/' file

или

sed -r -i 's/(difok=)[^ ]+/\18/' file

Выход:

password requisite pam_cracklib.so difok=8 abcd
...