bash:sed不会将管道结果写入源文件

时间:2015-04-27 19:06:14

标签: bash sed pipe

我在一个简单的管道中面对这种奇怪的行为:

ByteBuffer

结果是一个空文件,而不是tmp.txt中所需的“BBB” 如果我选择不同的文件输出,它的工作原理。一些想法?提前thx!

3 个答案:

答案 0 :(得分:0)

你可以这样写:

sed 's/A/B/g' tmp.txt > tmp2.txt
mv tmp2.txt tmp.txt

第一行将具有相关字符串替换的文件内容写入新文件。第二行将新文件移动到旧文件的位置,覆盖旧文件。

答案 1 :(得分:0)

要更改文件,请使用sed -i

$ echo "AAA" > tmp.txt
$ sed -i 's/A/B/g' tmp.txt
$ cat tmp.txt
BBB

以上使用GNU sed语法。如果您使用的是Mac OSX(BSD),请使用:

sed -i '' 's/A/B/g' tmp.txt

讨论

从问题中,考虑以下代码:

cat tmp.txt | sed 's/A/B/g' > tmp.txt

cat tmp.txt尝试从tmp.txt读取。但是,当shell看到> tmp.txt时,它会将tmp.txt截断为空文件以准备输入。这样的结果是不可靠的。

相比之下,

sed -i明确地设计用于处理这种情况。它完全避免了冲突。

如果您愿意,sed -i可以创建原始文件的备份。使用GNU sed,使用:

sed -i.bak 's/A/B/g' tmp.txt

使用BSD(Mac OSX)sed,添加空格:

sed -i .bak 's/A/B/g' tmp.txt

答案 2 :(得分:0)

为什么不选择'就地'编辑猫还是重命名?

sed 's/A/B/g' -i tmp.txt