2016-08-27 31 views
0

我有一個文件,它有多行。Bash腳本刪除文件中的一行

例如:

a 
ab# 
ad. 
a12fs 
b 
c 
... 

我想用sedawk刪除線,如果線包括符號或數字。 (例如,我想刪除:ab#,ad。,a12fs ....行) 或換句話說,我只想保留包含[a-z] [A-Z]的行。

我知道怎麼刪號線,

sed '/[0-9]/d' file.txt 

,但我不知道如何刪除符號線。

或者有沒有簡單的方法可以做到這一點?

回答

1

grep的工作也很好,是更簡單:只是做相反:保留您感興趣的線路,這是比較容易的方式來定義

grep -i '^[a-z]*$' file.txt 

(只包含字母和空行匹配線,並-i選項使得grep的不區分大小寫)

刪除空行,以及:使用Windows的文本文件時

grep -i '^[a-z]+$' file.txt 

小心,因爲還有在該行的最後一個回車,所以沒有什麼會根據grep的版本匹配(在Windows這裏測試和它的作品)

但以防萬一:

grep -iP '^[a-z]*\r?$' 

(注意-p選項使perl的表達式或\r無法識別)

1

您可以使用此sed

sed '/^[A-Za-z0-9]\+$/!d' file 

(OR)

sed '/[^A-Za-z0-9]/d' file 
2

爲了保持空白行:

grep '^[[:alpha:]]*$' file 
sed '/[^[:alpha:]]/d' file 
awk '/^[[:alpha:]]*$/' file 

要刪除空行:

grep '^[[:alpha:]]+$' file 
sed -E -n '/^[[:alpha:]]+$/p' file 
awk '/^[[:alpha:]]+$/' file 
1
$ awk '!/[^[:alpha:]]/' file.txt 
a 
b 
c 
+0

'/ [^ [:阿爾法:]]!/'手段「** NOT **包含** NOT **字母「的字符」,這是雙重否定的,因此如果可能的話最好避免。 –

+1

@Ed Morton,我在你的回答中看到你如何處理'awk'解決方案,而你的方法當然是有道理的。也就是說,這個解決方案怎麼會有問題,或者你能否指出我的方向,我可以讀到關於爲什麼我應該避免使用雙重否定的方法。謝謝。 – user3439894

+1

無論是編程語言還是口頭語言,雙負片都很難理解,負片的負片是正片( - ( - 1)= 1),所以無論何時遇到一個書寫編碼,您都應該花時間找出積極的條件是什麼,然後寫出來。爲了擴大這一點 - 不要以負面的方式寫變量(例如'databaseNotAvailable'),因爲你幾乎可以保證必須在某處寫入雙重否定(例如'!databaseNotAvailable')。與'!databaseIsAvailable'和'databaseIsAvailable'比較)。對不起,我不知道一個很好的參考。 –