Это потому, что по умолчанию 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
)