这个sed表达式出了什么问题?

时间:2012-03-02 03:03:01

标签: sed

sed's _((checksum | compressed)= \“)。*(\”)_ \ 1 \ 2_'-i filename

我正在使用此命令将校验和和压缩字段替换为空?但它没有改变什么?

例如,我想更改此行“checksum =”XXXXX“with checksum =”“,并且还要更换 压缩=“XXXX”,压缩=“”

我的sed命令出了什么问题?

3 个答案:

答案 0 :(得分:1)

这是因为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包含")。

(感兴趣的是,如果没有extended-regexp(-r / -E)标志,你将如何做到这一点,请注意捕获括号和OR |只有在它们被转义时才被认为是正则表达式:

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

答案 1 :(得分:1)

这可能对您有用:

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

在sed中(没有-r切换),()|+?{}必须先加\才能赋予它们分组的品质。交替,一个或多个,零或一个和间隔。无论如何,.[]*都可以作为元字符工作。

答案 2 :(得分:0)

尝试:

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