我在目录中包含许多行的文件,如下所示:
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命令.
解决方案 :
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 i
flag 应该这样工作
-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/flags
sed 函数,则其他文件名将被解释为 sed 操作的常规文件。