我在一个简单的管道中面对这种奇怪的行为:
ByteBuffer
结果是一个空文件,而不是tmp.txt中所需的“BBB” 如果我选择不同的文件输出,它的工作原理。一些想法?提前thx!
答案 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