2015-05-07 119 views
0

我有一個大文本文件,每行有數千個字。刪除任何以大寫字母開頭的行

如何我可以刪除開頭大寫字母,並且只是一個字母的所有行的所有行。

A   -> To be deleted 
a   -> To be deleted 
abjurer 
abkar 
abkari 
Abkhas  -> To be deleted 
Abkhasian -> To be deleted 
ablach 
ablactate 
ablactation 
B   -> To be deleted 
b   -> To be deleted 
Bounce  -> To be deleted 
... 
... 

是否可以用Bash來做到這一點。

謝謝。

+0

絕對有可能使用任何的AWK/grep的/ SED。給它一個去,讓我們知道你卡住的地方! – Johnsyweb

+0

是否要刪除以單個**字母**或單個**字符**開頭的行?編輯您的問題以顯示例如僅包含數字「3」的行會發生什麼。 –

+5

我正在投票結束這個問題,因爲它只是要求編寫代碼而沒有任何解決問題的嘗試。 – Johnsyweb

回答

7

您可以使用:

grep -Ev '^([A-Z]|.$)' file 
abjurer 
abkar 
abkari 
ablach 
ablactate 
ablactation 

或者使用SED還保存更改:

sed -i.bak -r '/^.$|[A-Z]/d' file 
5

我會說:

$ awk 'length($0)>1 && !/^[A-Z]/' file 
abjurer 
abkar 
abkari 
ablach 
ablactate 
ablactation 

這就驗證字符串:

  • 長度超過1個字符。
  • 不以任何大寫字母開頭。

您也可以按照hek2mgl's good suggestion和使用的!/^[[:upper:]]/'代替!/^[A-Z]/不依賴於您的語言環境。

+0

謝謝,這對我很好。 – nmvictor

+0

這是否可以修改,以捕獲只有重複字符的行? 'AAAA AA BB bbbb' – nmvictor

+7

這聽起來從最初的問題完全不同,需要進一步的信息。你最好提出一個新問題來說清楚。 – fedorqui

4

我會用sed此:

sed '/^.$/d;/^[[:upper:]]/d' file 

這是相隔兩個命令一個;。第一行刪除僅包含單個字母的行,第二行刪除以大寫字母開頭的行。我真的鼓勵您使用[[:upper:]]而不是[A-Z],以使其獨立於您的語言環境。

5
awk '!/^([[:upper:]]|[[:alpha:]]$)/' file 

grep -Ev '^([[:upper:]]|[[:alpha:]]$)' file 

sed -r '/^([[:upper:]]|[[:alpha:]]$)/d' file 
+0

你爲什麼使用'upper |阿爾法? – hek2mgl

+0

請注意'alpha'後的'$'。刪除以大寫字母開始的行和用^ alpha $'刪除只包含字母的行是'^ upper'。 –

+1

噢,是的,錯過了括號的位置。聰明! :) – hek2mgl

相關問題