这个sed表达式有什么问题?
sed的文件名((校验和压缩)=\”.*(\”)\u1\2\ui'-i 我正在使用此命令将校验和和压缩字段替换为空?但它没有改变什么 例如,我希望将此行“checksum=”更改为checksum=”,并替换为 compressed=“XXXX”与compressed=“”这个sed表达式有什么问题?,sed,Sed,sed的文件名((校验和压缩)=\”.*(\”)\u1\2\ui'-i 我正在使用此命令将校验和和压缩字段替换为空?但它没有改变什么 例如,我希望将此行“checksum=”更改为checksum=”,并替换为 compressed=“XXXX”与compressed=“” 我的sed命令有什么问题?这是因为sed默认使用了一种有趣的regex方言:您必须避开括号。 如果要使用您熟悉的“普通”正则表达式,请使用-r标志(如果您在unix上,GNU sed)或-E标志(Mac OS X BSD s
我的sed命令有什么问题?这是因为sed默认使用了一种有趣的regex方言:您必须避开括号。 如果要使用您熟悉的“普通”正则表达式,请使用
-r
标志(如果您在unix上,GNU sed)或-E
标志(Mac OS X BSD sed):
此外,请注意,在sed
中有三组捕获括号,我认为您希望将\1\2
更改为\1\3
(\1包含校验和=“
,\2包含校验和
,以及\3包含”
)
(出于兴趣,这里介绍了在没有extended regexp(-r/-E)标志的情况下如何操作,请注意,捕获括号和OR|
仅在转义的情况下才在regex意义上考虑:
sed 's_\(\(checksum\|compressed\)=\"\).*\(\"\)_\1\3_' -i filename
)试试:
sed 's/\(\(checksum\|compressed\)\)="[^"]*"/\1=""/' -i filename
这可能适合您:
echo 'checksum="XXXXX" compressed="YYYYYYY"' |
sed 's/\(checksum\|compressed\)="[^"]*"/\1=""/g'
checksum="" compressed=""
在sed中(没有
-r
开关),()|+?{}
必须有一个\
前缀,以赋予它们分组的性质。交替、一个或多个、零或一个和间隔。[]*
以元字符的形式工作。unix是否正在将*
扩展到当前目录中的文件名?一些术语:“有趣的”正则表达式方言称为基本正则表达式(在sed和grep中使用)。“normal”正则表达式(可能)是一个扩展正则表达式(在awk和grep-E中使用)。BRE和ERE都有扩展,特别是在GNU实现中。还有Perl风格的正则表达式(许多变体,许多语言)。
echo 'checksum="XXXXX" compressed="YYYYYYY"' |
sed 's/\(checksum\|compressed\)="[^"]*"/\1=""/g'
checksum="" compressed=""