sed错误-未终止的替换模式
我所在目录中的文件由许多行组成,如下所示:sed错误-未终止的替换模式,sed,Sed,我所在目录中的文件由许多行组成,如下所示: 98.684807 :(float) 52.244898 :(float) 46.439909 :(float) 然后是终止的一行: [chuck]: cleaning up... 我试图从每个文件中删除:(float)(但保留数字),并删除清理。。。线路 我可以得到: sed -ie 's/ :(float)//g' * 但这会创建保留旧文件的文件。删除-e标志将导致未终止的替换模式错误 同样的处理: sed -ie 's/[chuck]: c
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' *
想法
sed -i -e 's/ :(float)//g' *
通过这种方式,您告诉sed不要保存副本(空长度备份扩展到-i
),并单独指定sed命令
sed -ie expression [files...]
相当于:
sed -ie -e expression [files...]
两者都意味着将表达式应用于文件,覆盖文件,但使用“e”作为备份后缀保存旧文件
我想你想要:
sed-i-e表达式[文件…]
现在,如果您从中得到一个错误,那么您的
表达式肯定有问题
您的数字将由(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
检查目录中是否有奇怪的文件名 以下是复制错误的一种方法:
$ 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:"
解决方案:
sed-i''s/:(float)//g'*
sed-i''s/[chuck]:清理…//g'*
说明:
我可以得到:
sed -ie 's/ :(float)//g' *
但这会创建保留旧文件的文件
这是因为sed
的i
标志应该是这样工作的
-i分机
就地编辑文件,以指定的扩展名保存备份。如果提供零长度扩展名,则不会保存备份
在这种情况下,e
将被解释为您要使用其保存备份的扩展名。因此,您的所有原始文件都将在其名称后面附加一个e
为了提供零长度扩展,您需要使用-i'
注意:与-i
不同,-i'
不起作用。您需要在-i
和'
之间有一个空格字符,它才能工作
删除-e标志将导致未终止的替换模式错误 当您移除紧跟在
-i
之后的e
时,即
sed-i的/:(float)//g'*
s/:(float)//g
现在将被解释为i
标志的扩展参数。通过*
的shell扩展生成的文件列表中的第一个文件被解释为sed函数(很可能是s/regular expression/replacement/flags
函数),您可以通过检查
sedfn=$(echo*| cut-d'-f1);[${sedfn:0:1}==“s”];echo$?
如果上述命令链的输出为0
,则我们的假设得到验证
同样在这种情况下,如果第一个文件名符合有效的s/regular expression/replacement/flags
sed函数,其他文件名将被解释为常规文件,以便sed操作。如果我有一个名为abc的文件,“创建保留旧文件的文件”是什么意思。它从文件abc中删除了行,但创建了一个名为abce的文件。g
不是必需的,如果模式每行只出现一次。我知道我迟到了,但是sed-ie's/:(float)//g'*
和sed-ie's/[chuck]:清理…//g'*
可能不会达到你期望的效果;()
周围的(float)
,[]
周围的[float]
,以及清理…
中的..
都是特殊模式。使用sed-ie的/:(float)//g'*
,它可能也会匹配:float
。使用sed-ie's/[chuck]:cleaning up…//g'*
,它与[chuck]:cleaning up…
不匹配,但与k:cleaning up123
匹配。对于出现错误“unterminated transform source string”的人,这实际上也是答案。在某些版本的sed(特别是BSD版本,随macOS提供)上,如果您不希望sed进行备份,则必须在-i
之后明确包含空字符串'
,在其他平台上,您可以省略此项。不幸的是,sed在需要时输出的错误消息非常隐晦。
sed -ie 's/ :(float)//g' *