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

时间:2010-02-16 04:06:29

标签: sed

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

98.684807 :(float)
52.244898 :(float)
46.439909 :(float)

然后终止一行:

[chuck]: cleaning up...

我正在尝试从每个文件中删除:(float)(但保留号码)并删除清理...行。

我可以得到:

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

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

同样处理:

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

思想?

6 个答案:

答案 0 :(得分:13)

sed  -i  ''  -e  's/:(float)//'  -e  '/^.chuck/d'  *

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

答案 1 :(得分:3)

sed -ie expression [files...]

相当于:

sed -ie -e expression [files...]

并且两者都意味着将表达式应用于文件,覆盖文件,但保存旧文件时使用“e”作为备份后缀。

我想你想要:     sed -i -e表达式[files ...]

现在,如果您收到错误,那么expression一定有问题。

答案 2 :(得分:3)

您的号码由(float)字符:分隔。因此,您可以使用awk / cut来获取您的号码。它比正则表达式更简单

$ head -n -1  file | awk -F":" '{print $1}'
98.684807
52.244898
46.439909

$ head -n -1  file | cut -d":" -f1
98.684807
52.244898
46.439909

答案 3 :(得分:1)

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

答案 4 :(得分:1)

检查目录中是否有任何奇怪的文件名。

以下是复制错误的一种方法:

$ touch -- "-e s:x:"
$ ls
-e s:x:
$ sed -i "s/ :(float)//g' *
sed: -e expression #1, char 5: unterminated `s' command

防止这种情况的一种方法是在使用通配符时使用双短划线终止sed的选项:

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

你可以做同样的事情来删除文件:

$ rm "-e s:x:"
rm: invalid option -- 'e'
$ rm -- "-e s:x:"

答案 5 :(得分:1)

解决方案:

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

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

说明:

我可以得到:

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

可以正常工作,但会创建保存旧文件的文件。

那是因为sed的{​​{1}}标志应该以那种方式工作

  

-i 扩展名

     

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

在这种情况下,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 sed函数,则其他文件名将被解释为sed操作的常规文件。