2013-11-22 42 views
0

我想要一個命令,只有輸出的行以「COLOR =」開始,然後只有紅色,綠色,黃色,藍色,紅色,青色,白色或黑色。每種顏色用「|」分隔,順序可以混洗,指定的顏色可以重複,大小寫忽略)。任何幫助是極大的讚賞!如何拉出線只包含特定的字符串

例如,我有一個包含以下行的文件...

COLOUR=ACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE| 
COLOUR=ACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN  |WHITE| TOMORROW 
COLOUR=RED|GREEN|yellow|BLUE|MAGENTA|CYAN|white  
COLOUR=*BL*ACK|RE D|GREEN|YELLOWabc| 
COLOUR=BLACK|green|YELLOW|RED|WHiTE|BLUE|MAGENTA|CYAN 
COLOUR=BLACK|GR 
COLOUR=BLACK 
COLOUR=BLACK| 
COLOUR=BLACK|BLACK|BLACK 
COLOUR=RED|RED|RED|BluE|YELLOW|yellow|CYAN|black 
COLOUR=COLOUR = COLOUR 
COLOUR=RED|HELLO|THANKS 

,這是我需要的輸出:我想你是其次是後COLOUR=

COLOUR=RED|GREEN|yellow|BLUE|MAGENTA|white 
COLOUR=BLACK|green|YELLOW|RED|WHiTE|BLUE|MAGENTA|CYAN 
COLOUR=BLACK 
COLOUR=BLACK|BLACK|BLACK 
COLOUR=RED|RED|RED|BluE|YELLOW|yellow|CYAN|black 
+0

抱歉,我開始該職位前些日子爲不同的話題,但沒有發佈,這是完全不同的話題。我只是改了標題 – BigDan

+0

這是我在線上研究數小時後得到的...但是它將文件中的所有內容都拉出來... awk'/^COLOR =/&&/BLACK | RED | GREEN | YELLOW | BLUE | MAGENTA | CYAN | WHITE /'IGNORECASE = 1 – BigDan

回答

2

(RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE|BLACK)後跟一個管道,然後是最後一個顏色(可選地後面跟着一個管道),所有區分大小寫:

鑑於你的輸入文件,它產生所需的輸出:

COLOUR=RED|GREEN|yellow|BLUE|MAGENTA|CYAN|white 
COLOUR=BLACK|green|YELLOW|RED|WHiTE|BLUE|MAGENTA|CYAN 
COLOUR=BLACK 
COLOUR=BLACK|BLACK|BLACK 
COLOUR=RED|RED|RED|BluE|YELLOW|yellow|CYAN|black 
+0

thx供您參考。最後一種顏色應該以8種顏色中的一種結束,而不是一種管子。我嘗試了你剛纔提供的代碼,也取出了/ ...和其他任何東西 – BigDan

+0

這裏有一個很大的區別'/|'如你的評論和'\ |',就像我的代碼一樣。它在Mac OS X 10.9上使用'bash' 3.2.51和BSD'grep'(2.5.1-FreeBSD)正確運行。其中一條輸入行最後有一個「|」(但在開頭附近有一個「ACK」),所以目前還不清楚是否需要。在正則表達式中的'$'之前的'\ |?'允許尾部的'|';刪除這三個字符,顏色必須結束。 –

+0

感謝您的回覆,但我確實嘗試了您的原始行,並使用上面的示例文件。它仍然無所謂 – BigDan

0

嘗試使用以下perl的一行

perl -F'=|\|' -lane 'shift @F eq "COLOUR" and grep {!/RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE|BLACK/i} @F or print' file 

輸出

COLOUR=RED|GREEN|yellow|BLUE|MAGENTA|CYAN|white 
COLOUR=BLACK|green|YELLOW|RED|WHiTE|BLUE|MAGENTA|CYAN 
COLOUR=BLACK 
COLOUR=BLACK|BLACK|BLACK 
COLOUR=RED|RED|RED|BluE|YELLOW|yellow|CYAN|black 
+0

對不起,我是一個新手。我添加了這一行後,它只是說沒有找到命令...我需要在使用perl之前在我的bash腳本中指定嗎? 謝謝 – BigDan

+1

@BigDan:輸入'which perl'。如果它說沒有找到命令,你可能沒有安裝perl,或者沒有在你的'$ PATH'中。如果你沒有安裝它,你必須嘗試提供的其他解決方案之一。 – pgl

+0

@BigDan我相信'perl'是現在非常基本的工具,隨着大多數Linux/OS發行版。正如前面的'pgl'評論所述,請檢查是否安裝了'perl'。如果你不在Ubuntu上試試'sudo apt-get install perl' – jkshah

0
$ awk ' 
    BEGIN{ c="RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE|BLACK" } 
    toupper($0) ~ "^COLOUR=(" c ")([|](" c "))*$" 
' file 
COLOUR=RED|GREEN|yellow|BLUE|MAGENTA|CYAN|white 
COLOUR=BLACK|green|YELLOW|RED|WHiTE|BLUE|MAGENTA|CYAN 
COLOUR=BLACK 
COLOUR=BLACK|BLACK|BLACK 
COLOUR=RED|RED|RED|BluE|YELLOW|yellow|CYAN|black 
+0

我只是試過它..它不會返回任何東西.. – BigDan

+0

然後你複製/粘貼錯誤或您的輸入文件不是你描述過的,或者你正在使用破舊的awk(Solaris上的/ usr/bin/awk)。也許你有控制字符或空白在行結束或中間? –

+0

是的,它現在的作品,我留下了一些空白後,出於某種原因的線... anywayz,非常感謝!我只是想了解你的代碼atm ...所以,在開始時你使用「BEGIN {}」作爲正則表達式,然後使用toupper將所有內容都轉換爲大寫字母......我假設$(0)表示整行?和「〜」之後的意思是「grep^COLOR =(」c「)([|](」c「))* $'......我是否正確?再次感謝! – BigDan

相關問題