sed错误 - 未终止的替代模式

Mar*_*k C 10 sed

我在目录中包含许多行的文件,如下所示:

98.684807 :(float)
52.244898 :(float)
46.439909 :(float)
Run Code Online (Sandbox Code Playgroud)

然后是一行终止:

[chuck]: cleaning up...
Run Code Online (Sandbox Code Playgroud)

我试图消除:(float)每个文件(但保留数字),并删除清理...行.

我可以得到:

sed -ie 's/ :(float)//g' *
Run Code Online (Sandbox Code Playgroud)

工作,但创建保存旧文件的文件.删除-e标志会导致未终止的替换模式错误.

同样处理:

sed -ie 's/[chuck]: cleaning up...//g' *
Run Code Online (Sandbox Code Playgroud)

思考?

Dig*_*oss 13

sed  -i  ''  -e  's/:(float)//'  -e  '/^.chuck/d'  *
Run Code Online (Sandbox Code Playgroud)

这样你就告诉sed不要保存副本(空长备份扩展-i)并单独指定sed命令.


Bha*_*tri 5

解决方案 :

sed -i '' 's/ :(float)//g' *

sed -i '' 's/[chuck]: cleaning up...//g' *

解释 :

我可以得到:

sed -ie 's/ :(float)//g' *
Run Code Online (Sandbox Code Playgroud)

工作,但这会创建保留旧文件的文件。

那是因为sed's iflag 应该这样工作

-i扩展名

就地编辑文件,使用指定的扩展名保存备份。如果给出零长度扩展,则不会保存备份。

在这种情况下e,被解释为您想要用来保存备份的扩展名。因此,您的所有原始文件都将被备份,并e在其名称后附加 。

为了提供零长度扩展,您需要使用-i ''.

注意:与 不同-i<your extension>-i''不起作用。您需要在和之间有一个空格字符才能使其正常工作。-i''


删除 -e 标志会导致未终止的替代模式错误。

当您删除e紧随其后的内容时-i,即

sed -i 's/ :(float)//g' *

s/ :(float)//g现在将被解释为标志的扩展参数i。shell 扩展生成的文件列表中的第一个文件*被解释为 sed function(最有可能是s/regular expression/replacement/flags函数)您可以通过检查输出来验证这一点

sedfn=$(echo * | cut -d' ' -f1); [[ ${sedfn:0:1} == "s" ]]; echo $?

如果上述命令链的输出为0,则我们的假设得到验证。

同样在这种情况下,如果第一个文件名以某种方式符合有效的s/regular expression/replacement/flagssed 函数,则其他文件名将被解释为 sed 操作的常规文件。