6

有没有unix one liner来做到这一点?

head -n 3 test.txt > out_dir/test.head.txt
grep hello test.txt > out_dir/test.tmp.txt
cat out_dir/test.head.txt out_dir/test.tmp.txt > out_dir/test.hello.txt
rm out_dir/test.head.txt out_dir/test.tmp.txt

即,我想同时从给定文件中获取标题和一些 grep 行。

4

5 回答 5

8

你可以说:

{ head -n 3 test.txt ; grep hello test.txt ; } > out_dir/test.hello.txt
于 2013-11-12T18:06:06.290 回答
8

使用 awk:

awk 'NR<=3 || /hello/' test.txt > out_dir/test.hello.txt
于 2013-11-12T18:06:14.673 回答
3

awk解决方案是最好的,但为了完整起见,我将添加一个 sed 解决方案:

$ sed -n test.txt -e '1,3p' -e '4,$s/hello/hello/p' test.txt > $output_file

-n除非指定,否则不打印一行。是-e命令'1,3p打印前三行4,$s/hello/hello/p查找包含单词的所有行hello,然后替换hello回来。p最后打印出替换操作的所有行。

应该有一种使用方式4,$g/HELLO/p,但我无法让它工作。自从我真正搞砸 sed 以来已经有很长时间了。

于 2013-11-12T18:49:06.917 回答
3

尝试使用sed

sed -n '1,3p; /hello/p' test.txt > out_dir/test.hello.txt
于 2013-11-12T18:38:22.250 回答
2

当然,我会去awk,但这里是怀旧ed前的解决方案:vi

ed test.txt <<%
4,$ v/hello/d
w test.hello.txt
%
于 2013-11-12T20:44:04.120 回答