如何从unix或solaris中的文件中删除包含字符串的行

时间:2011-03-14 07:37:02

标签: shell unix sed solaris

我的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

任何人都可以建议,命令错了吗?

10 个答案:

答案 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读完之前写入文件,则会导致数据损坏。 也许您也可以尝试使用buffermbuffer作为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