2013-11-22 9 views
0

Мне нужна команда, которая выводит строки только с помощью «COLOR =», а затем ТОЛЬКО как RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, так и BLACK , Каждый цвет разделяется символом «|», порядок может быть перетасован, указанные цвета могут повторяться, а случай игнорируется). Любая помощь очень ценится!Как вытаскивать строки ТОЛЬКО содержит определенные строки

Например, у меня есть файл, который содержит следующие строки ...

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=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

Я полагаю, что вы после COLOUR= следуют последовательность с нулем или более (RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE|BLACK) с последующей трубкой, за которой следует конечный один из цветов, необязательно сопровождаемый трубой, все регистрозависимые:

grep -Ei '^COLOUR=((RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE|BLACK)\|)*(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

извините, что я новичок. после того, как я добавил эту строку, он просто говорит, что команда не найдена ... мне нужно указать в моем сценарии bash перед использованием perl? спасибо – BigDan

+1

@BigDan: Введите 'which perl'. Если он говорит, что команда не найдена, у вас либо нет установленного perl, либо нет в вашем '$ PATH'. Если вы его не установили, вам придется попробовать одно из других предлагаемых решений. – pgl

+0

@BigDan Я считаю, что 'perl' теперь очень простой инструмент поставляется с большинством дистрибутивов Linux/OS. Как описано в предыдущем комментарии «pgl», проверьте, установлен ли «perl».Если не попробовать 'sudo apt-get install perl', если вы на Ubuntu – 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 (/ usr/bin/awk на Solaris). Может быть, у вас есть контрольные символы или пробелы в конце или в середине строк? –

+0

ДА, теперь это работает, я почему-то оставил некоторое пространство после строк ... anywayz, спасибо огромное! Я просто пытаюсь понять ваш код atm ... поэтому в начале вы использовали «BEGIN {}» в качестве регулярного выражения, а затем переводите все в верхний регистр с помощью toupper ... Я предполагаю, что $ (0) означает всю строку? и «~» после середины «grep^COLOR = (« c ») ([|] (« c »)) * $ '... я прав? Спасибо снова! – BigDan

Смежные вопросы