sed's _((checksum | compressed)= \“)。*(\”)_ \ 1 \ 2_'-i filename
我正在使用此命令将校验和和压缩字段替换为空?但它没有改变什么?
例如,我想更改此行“checksum =”XXXXX“with checksum =”“,并且还要更换 压缩=“XXXX”,压缩=“”
我的sed命令出了什么问题?
答案 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