Что не так с этим выражением sed? - PullRequest
0 голосов
/ 02 марта 2012

sed 's _ ((контрольная сумма | сжатый) = \ "). * (\") _ \ 1 \ 2_' -i имя файла

Я использую эту команду для замены контрольной суммы и сжатого файла пустым? Но это ничего не изменило?

например, я хочу изменить эту строку "Checkum =" XXXXX "с Checkum =" ", а также заменить сжатый = "XXXX" со сжатым = ""

Что не так с моей командой sed?

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Это может работать для вас:

echo 'checksum="XXXXX" compressed="YYYYYYY"' | 
sed 's/\(checksum\|compressed\)="[^"]*"/\1=""/g'
checksum="" compressed=""

В sed (без переключателя -r), ()|+?{} должен иметь добавленный \, чтобы придать им свойства группировки. чередование, один или несколько, ноль или один и интервалы. .[]* в любом случае работают метасимволами.

1 голос
/ 02 марта 2012

Это потому, что по умолчанию sed использует забавный диалект регулярных выражений: вы должны избегать захвата скобок.Если вы хотите использовать «обычное» регулярное выражение, с которым вы знакомы, используйте флаг -r (если вы используете unix, GNU sed) или флаг -E (Mac OS X BSD sed):

sed -r 's_((checksum|compressed)=\").*(\")_\1\3_' -i filename

Кроме того, обратите внимание, что в вашем sed есть три набора скобок для захвата, и я думаю, что вы хотите изменить \1\2 на \1\3.(\ 1 содержит checksum=", \ 2 содержит checksum, а \ 3 содержит ").

(Для интереса, вот как вы это сделаете без расширенного регулярного выражения (-r / -E) пометьте, обратите внимание, что квадратные скобки и OR | рассматриваются только в смысле регулярных выражений, если они экранированы:

sed 's_\(\(checksum\|compressed\)=\"\).*\(\"\)_\1\3_' -i filename

)

0 голосов
/ 02 марта 2012

Попробуйте:

sed 's/\(\(checksum\|compressed\)\)="[^"]*"/\1=""/' -i filename
...