2017-04-19 170 views
2

請幫助 - 我卡住了。sed:刪除所有不包含字符串A或B的行,從第二行開始

我需要

  1. 刪除文本文件
  2. 不包含富或富
  3. 從文件

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將是一個可能的選擇,太多。)

+1

什麼是你'2nd'方式的另一個AWK?你能否澄清它 –

+1

預期輸出的示例文件應該是強制性的。 –

+0

爲什麼足球不是輸出的一部分? – Thor

回答

4

sed的方法:

sed -e '2,${/[fF]oo/!d}' file 

-e腳本--expression =腳本

添加的命令在腳本到要運行的命令集,而 處理輸入。

2,$ - 的地址範圍,考慮來自第二行中的線端部

[fF] - 字符類,匹配或者fF

/!d - 刪除不含有foo線或Foo

+0

我也誤解了這個問題,OP想刪除不包含foo或Foo的行 –

+0

@ZumodeVidrio,是的,有一些令人困惑的時刻 – RomanPerekhrest

+0

完美 - 非常感謝! –

1

一個偶然的機會,但沒有sed既不awk(不知道如果他們在你的情況下強制的),您可以複製文本文件的第一行中的一個新的文件:

head -1 textfile > newfile 

然後你就可以追加所有以foo或富內容的新文件:

grep "foo\|Foo" textfile >> newfile 

所以你將不得不在newfile中所需的內容。

如果你想擁有它的原始文件,那麼你可以將它:

mv newfile textfile 

如果第一行包含富或的Foo將被打印兩次,但你說你想保持第一行,我認爲它不會有foo和Foo。

+0

實際上,第一行將在新文件中兩次 – user31264

2

在awk中。首先一些測試數據:

$ cat file 
1 begin 
2 asd 
3 foo 
4 sdf 
5 Foo 
6 end 

代碼。print記錄包含fooFoo第一記錄之後:

$ awk 'NR==1 || /[fF]oo/' file 
1 begin 
3 foo 
5 Foo 
+0

OP問所有但首先:-) – NeronLeVelu

+1

@NeronLeVelu我注意到,在評論中抱怨,感到沮喪和放棄。不是我的一天。固定。 –

+0

@James Brown對不起,沒有正確描述輸入/輸出!現在在問題中添加了一些數據。謝謝! –

3
awk 'NR==1 || !/foo|Foo/' oldfile > newfile 

注:如果您使用csh或tcsh,你需要保護!用反斜槓:

awk 'NR==1 || \!/foo|Foo/' oldfile > newfile 
+0

詳細'awk'NR == 1 || !/ [fF] oo /'oldfile> newfile' – NeronLeVelu

2

一個很好的選擇是反轉你的要求 - 刪除所有行,但用foo或Foo打印第一行和所有行。

sed -n '1p; /foo\|Foo/p'

這一個將打印的第一行的兩倍,如果它包含FOO或富,但如果需要,可以容易地固定。

1

以下是您的代碼:

sed '2,$/*.foo.*\|.*Foo.*/!d' 

這裏的問題是您正在使用兩種形式的行尋址,即數字(addr1,addr2)和匹配(/REGEX/)。另外,您的正則表達式中存在錯誤。

這裏是我會怎麼解決這個問題:

sed '1b; /[fF]oo/!d' infile 

輸出:

first line 
foobar 
Foo Bar 
Football 
Foobar 
foo bar 
+0

POSIX版本(非GNU sed):'sed -e'1b'-e'/ [Ff] oo /!d'infile' – NeronLeVelu

+0

非常感謝您的支持回答,托爾! 完美的作品! –

0
awk '/^[fF]/&&!/fish/' file 

first line 
foobar 
Foo Bar 
Football 
Foobar 
foo bar 
相關問題