我的myfile如下
test1
test2
test3
test4
test5
我想删除包含test2的行,所以我使用了如下命令,但不是只删除'test2'行,而是删除整个文件,fize-size变为零。
bash# cat /aaa/bbb/ccc/myfile | sed -e '/test2/ d' > /aaa/bbb/ccc/myfile
bash# ls -l total 0
-rw-r--r-- 1 root root 0 3月 11 17:41 myfile
任何人都可以建议,命令错了吗?
答案 0 :(得分:7)
除非你有GNU sed(带有“-i”选项),并且你在Solaris上,所以你可能没有,你别无选择,只能写入临时文件:
sed -e '.....' infile > infile.tmp
mv infile.tmp infile
更新:使用ed
printf "%s\n" 'g/test2/d' w q | ed infile
答案 1 :(得分:5)
我不知道perl是否是Solaris上的标准配置。如果是这种情况,您可以使用:
perl -ni -e 'if(!/test2/){print;}' myfile
答案 2 :(得分:2)
你可以简单地使用好的旧版:
echo "/test2
d
w
q" | ed /aaa/bbb/ccc/myfile
答案 3 :(得分:1)
不幸的是,输出重定向会立即清空输出文件。因此,您必须使用不同的文件作为输出文件,例如:
sed '/test2/d' /aaa/bbb/ccc/myfile > /aaa/bbb/ccc/myfile2
或者你可以做到,例如类似的东西:
sed '/test2/d' /aaa/bbb/ccc/myfile | tee /aaa/bbb/ccc/myfile
但由于缓冲,这不是很可靠。如果输出程序(tee
)在sed读完之前写入文件,则会导致数据损坏。
也许您也可以尝试使用buffer
或mbuffer
作为tee
的替代,您可以指定缓冲区大小。但是我在快速试验中没有取得可靠的成功。
答案 4 :(得分:1)
您还可以使用grep
:
> grep -v test2 test.txt
test1
test3
test4
test5
请注意,与sed
一样,您不应该覆盖您正在阅读的文件,因此您可以像这样调用它:
grep -v test2 test.txt> test.out
答案 5 :(得分:1)
Solaris,假设你不是一个古老的版本,应该已经至少带有bash 3.所以只使用bash
while read -r line
do
case "$line" in
*"test2"*) continue;;
*) echo "$line";;
esac
done < file > temp && mv temp file
答案 6 :(得分:1)
尝试
grep -v test2 test.txt > temp
mv temp test.txt
答案 7 :(得分:0)
以下代码对我来说很好......
touch myfile2
cp /aaa/bbb/ccc/myfile myfile2
sed '/test2/d' myfile2 > /aaa/bbb/ccc/myfile
答案 8 :(得分:0)
您可以在AWK中将整个文件读入数组:
awk '!/test2/ {a[++c] = $0} END {for (i=1; i<=c; i++) print a[i] > FILENAME}' /aaa/bbb/ccc/myfile
由于shell不进行重定向,因此不会执行早期截断。
答案 9 :(得分:0)
$touch myfile
$printf "test1\ntest2\ntest3\ntest4\ntest5\n">myfile
$cat myfile
test1
test2
test3
test4
test5
$sed '2d' myfile
test1
test3
test4
test5
所以使用:
$sed '2d' myfile