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

Toa*_*ast 13 shell sed

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

它看起来像这样:

sed -i 's/string1/string2/g' test.txt
Run Code Online (Sandbox Code Playgroud)

问题是,"string1"不一定存在于test.txt中.

我注意到在执行了一堆这些sed命令之后,我得到了一些空文件,留在了目录中,其名称如下所示:

"sed4l4DpD"

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

Boh*_*ian 9

-i是给新/输出文件的后缀.此外,您需要-e该命令.
以下是您使用它的方式:

sed -i '2' -e 's/string1/string2/g' test.txt
Run Code Online (Sandbox Code Playgroud)

这将创建一个称为test.txt2备份的文件test.txt

替换文件(而不是创建新副本 - 称为"就地"替换),请将-i值更改为''(即空白):

sed -i '' -e 's/string1/string2/g' test.txt
Run Code Online (Sandbox Code Playgroud)

编辑二

这是来自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
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 5

我无法通过快速测试(使用GNU sed 4.2.1)重现这一点 - 但strace确实显示sed创建一个名为的文件sedJd9Cuy,然后将其重命名为tmp(在命令行上命名的文件).

在sed创建临时文件之后,在它能够重命名之前,看起来出现了问题.

我最好的猜测是你的文件系统已经没空了; 您可以创建一个新的空文件,但无法写入它.

怎么df .说?

编辑:

我仍然不知道是什么导致了这个问题,但解决这个问题应该不会太困难.

而不是

sed -i 's/string1/string2/g' test.txt
Run Code Online (Sandbox Code Playgroud)

尝试这样的事情:

sed 's/string1/string2/g' test.txt > test.txt.$$ && mv -f test.txt.$$ test.txt
Run Code Online (Sandbox Code Playgroud)

sed创建的方式出了问题,然后重命名文本文件以替换原始文件.上面的命令使用sed作为简单的输入输出过滤器,并分别创建和重命名临时文件.


Toa*_*ast 4

因此,经过昨晚的大量测试,事实证明 sed 在尝试操作空字符串时正在创建这些文件。我获取“$string1”参数数组的方式是通过 grep 命令,该命令似乎格式错误。我想要从 grep 中得到的是包含“此处文本'.'”类型的所有行。

例如,Text here 'ABC.DEF'文件中的字符串“”应该被 grep 捕获,然后ABC.DEF该字符串的部分将被替换为ABC_DEF。不幸的是,我使用的 grep 会捕获“ Text here ''”类型的行(即“”之间没有任何内容)。当稍后,脚本尝试使用此空字符串执行 sed 替换时,会创建随机文件(可能是因为 sed 已终止)。

感谢您为理解 sed 工作原理提供的所有帮助。