sed命令创建随机命名的文件

时间:2011-10-12 00:05:19

标签: shell sed

我最近编写了一个执行sed命令的脚本,用名为“test.txt”的文件替换所有出现的“string1”和“string2”。

看起来像这样:

sed -i 's/string1/string2/g' test.txt

问题是,“string1”不一定存在于test.txt中。

我注意到在执行了一堆这些sed命令之后,我得到了一些空文件,留在了目录中,名字看起来像这样:

“sed4l4DpD”

有谁知道为什么会这样,以及我如何纠正它?

4 个答案:

答案 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

编辑II

这是来自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