我最近编写了一个执行sed命令的脚本,用名为“test.txt”的文件替换所有出现的“string1”和“string2”。
看起来像这样:
sed -i 's/string1/string2/g' test.txt
问题是,“string1”不一定存在于test.txt中。
我注意到在执行了一堆这些sed命令之后,我得到了一些空文件,留在了目录中,名字看起来像这样:
“sed4l4DpD”
有谁知道为什么会这样,以及我如何纠正它?
答案 0 :(得分:8)
-i
是新/输出文件的后缀。此外,命令需要-e
以下是您使用它的方式:
sed -i '2' -e 's/string1/string2/g' test.txt
这将创建一个名为test.txt2
的文件,该文件是test.txt
要替换文件(而不是创建新副本 - 称为“就地”替换),请将-i
值更改为''
(即空白) :
sed -i '' -e 's/string1/string2/g' test.txt
这是来自Mac(Snow Leopard)的实际命令行输出,显示我修改后的答案(从-i和后缀之间删除了空格)是正确的。
注意:在Linux服务器上,-i
和后缀之间必须没有空格。
> echo "this is a test" > test.txt
> cat test.txt
this is a test
> sed -i '2' -e 's/a/a good/' test.txt
> ls test*
test.txt test.txt2
> cat test.txt
this is a good test
> cat test.txt2
this is a test
> sed -i '' -e 's/a/a really/' test.txt
> ls test*
test.txt test.txt2
> cat test.txt
this is a really good test
答案 1 :(得分:5)
我无法通过快速测试(使用GNU sed 4.2.1)重现这一点 - 但strace确实显示sed创建了一个名为sedJd9Cuy
的文件,然后将其重命名为tmp
(在命令行上命名的文件。)
在sed创建临时文件之后,在它能够重命名之前,看起来出现了问题。
我最好的猜测是你的文件系统空间不足;你可以创建一个新的空文件,但无法写入它。
df .
说什么?
修改强>:
我仍然不知道是什么导致了这个问题,但要解决这个问题应该不会太难。
而不是
sed -i 's/string1/string2/g' test.txt
尝试这样的事情:
sed 's/string1/string2/g' test.txt > test.txt.$$ && mv -f test.txt.$$ test.txt
sed创建的方式出了问题,然后重命名文本文件以替换原始文件。上面的命令使用sed作为简单的输入输出过滤器,并分别创建和重命名临时文件。
答案 2 :(得分:2)
因此,经过昨晚的大量测试,结果发现sed在尝试操作空字符串时正在创建这些文件。我获取“$ string1”参数数组的方式是通过grep命令,这似乎是格式错误。我想从grep中得到的是包含“Text here”类型的所有行。'“。
例如,文件中的字符串“Text here 'ABC.DEF'
”应该已被grep捕获,然后字符串的ABC.DEF
部分将被ABC_DEF
替换。不幸的是,我使用的grep会捕获类型为“Text here ''
”的行(即,''之间没有任何内容)。稍后,脚本尝试使用此空字符串执行sed替换,随机文件已创建(可能是因为sed已死)。
感谢您帮助了解sed的工作原理。
答案 3 :(得分:-3)
如果你这样做会更好:
cat large_file | sed 's/string1/string2/g' > file_filtred