Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sed错误-未终止的替换模式_Sed - Fatal编程技术网

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' *