如何使用 sed 就地编辑文件描述符

Dun*_*tos 1 bash sed file-descriptor sh

我成功地使用 sed 文件描述符并在标准输出上给出结果。给出一个文件“file.txt”,其中包含:

$ cat file.txt
foo
Foo
Run Code Online (Sandbox Code Playgroud)

我打开 file.txt 的文件描述符,打开子 shell,然后将此文件描述符提供给 sed :

$ (sed "/Foo/c\\bar" <&9 ) 9< file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)

结果是正确的。

现在,如果我想使用 sed 的 -i 选项就地更改,我就会遇到麻烦。我以读写模式打开文件描述符,然后将其作为输入文件提供给 sed :

$ (sed -i "/Foo/c\\bar" <&9 ) 9<> file.txt
sed: no input file
Run Code Online (Sandbox Code Playgroud)

我不明白为什么缺少输入文件。也许 sed 在使用 -i 选项时需要文件名,而不是文件描述符?

我尝试了一种解决方法,当然,它不能按预期工作:

$ (sed "/Foo/c\\bar" <&9 >&9 ) 9<> file.txt
$ cat file.txt
foo
Foo
foo
bar
Run Code Online (Sandbox Code Playgroud)

虽然我期望:

$ cat file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助 !杜纳托塔托斯

Wil*_*ell 5

您无法使用 sed “就地”编辑任何内容,这是一个很好的例子,说明了为什么-i命名错误。gnu sed-i通过创建一个新文件,将输出写入其中,然后重命名该文件来实现。如果你不给 sed 原始文件名,它就不知道要重命名什么。