我在目录中的文件包含许多行,如下所示:
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' *
思想?
答案 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
函数)您可以通过检查1}的输出来验证这一点。 p>
s/regular expression/replacement/flags
如果上述命令链的输出为sedfn=$(echo * | cut -d' ' -f1); [[ ${sedfn:0:1} == "s" ]]; echo $?
,则验证我们的假设。
同样在这种情况下,如果第一个文件名有资格作为有效0
sed函数,则其他文件名将被解释为sed操作的常规文件。