请帮忙 - 我被困了。
我需要
infile中:
first line
foobar
tree
fish
Foo Bar
Football
Foobar
Street
foo bar
OUTFILE :
first line
foobar
Foo Bar
Football
Foobar
foo bar
我尝试了以下内容:
sed '2,$/*.foo.*\|.*Foo.*/!d' -i test.txt
产生的错误是:
sed:-e表达式#1,字符4:未知命令:`/'
我的错误是什么? (awk也是一种可能的选择。)
答案 0 :(得分:4)
sed 方法:
sed -e '2,${/[fF]oo/!d}' file
-e 脚本( - expression = script )
将 script 中的命令添加到要运行的命令集中 处理输入。
2,$
- 一个地址范围,考虑从第二行到结尾的行
[fF]
- 字符类,匹配f
或F
/!d
- 删除不包含foo
或Foo
答案 1 :(得分:3)
awk 'NR==1 || !/foo|Foo/' oldfile > newfile
注意:如果您使用csh或tcsh,则需要使用反斜杠保护!
:
awk 'NR==1 || \!/foo|Foo/' oldfile > newfile
答案 2 :(得分:2)
在awk中。首先是一些测试数据:
$ cat file
1 begin
2 asd
3 foo
4 sdf
5 Foo
6 end
代码。 print
后的第一条记录包含foo
或Foo
:
$ awk 'NR==1 || /[fF]oo/' file
1 begin
3 foo
5 Foo
答案 3 :(得分:2)
一个好的选择是颠倒你的要求 - 删除所有行,但打印第一行和所有行使用foo或Foo。
sed -n '1p; /foo\|Foo/p'
如果第一行包含foo或Foo,则会打印第一行两次,但如果需要,可以很容易地修复它。
答案 4 :(得分:2)
森林里的另一个笨蛋
awk '!a++||!/[fF]oo/' infile
答案 5 :(得分:1)
偶然但没有sed
awk
(不知道它们是否是强制性的),您可以将文本文件的第一行复制到新文件中:
head -1 textfile > newfile
然后你可以将foo或Foo的所有内容附加到新文件中:
grep "foo\|Foo" textfile >> newfile
所以你将在newfile中拥有所需的内容。
如果您想将它放在原始文件中,则可以移动它:
mv newfile textfile
如果第一行包含foo或Foo,它将被打印两次,但正如你所说,你想保留第一行,我认为它既没有foo也没有Foo。
答案 6 :(得分:1)
这是你的代码:
sed '2,$/*.foo.*\|.*Foo.*/!d'
这里的问题是您使用两种形式的行寻址,即数字(addr1,addr2
)和匹配(/REGEX/
)。此外,正则表达式中存在错误。
以下是我将如何解决它:
sed '1b; /[fF]oo/!d' infile
输出:
first line
foobar
Foo Bar
Football
Foobar
foo bar
答案 7 :(得分:0)
awk '/^[fF]/&&!/fish/' file
first line
foobar
Foo Bar
Football
Foobar
foo bar