Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个sed表达式有什么问题?_Sed - Fatal编程技术网

这个sed表达式有什么问题?

这个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的文件名((校验和压缩)=\”.*(\”)\u1\2\ui'-i

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

例如,我希望将此行“checksum=”更改为checksum=”,并替换为 compressed=“XXXX”与compressed=“”


我的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=""