Зчеплення з ERE не фільтрує лінії з опцією -v


2

Я намагаюся використовувати розширений параметр регулярного вираження в grep, щоб відфільтрувати файли, рядки, що мають на початку рядка такий формат рядка.

any-non-space-char:      *

Я припускав, що наступна команда збирається виконати трюк; однак він просто роздрукував усі рядки з 2-х файлів, які підбирає підстановка.


~/tmp > cat * | grep -v -E "^\S+:.{6}\*"
hi
test1      blah, blah, blah:      * blah, blah, blah"
test:      * blah, blah, blah:      * blah, blah, blah
sd
hi
temp:      * blah, blah, blah:      * blah, blah, blah"
temp2:     blah, blah, blah:      * blah, blah, blah
sd
~/tmp >

BTW, я псевдоніму grep to 'grep --color=auto', так що команда не виділяє відповідні рядки відповідно до регулярних виразів, які знаходяться test: *в рядку 3 і temp: *в рядку 6 у вищенаведеному висновку. Тим не менш, ці відповідні рядки друкуються на екрані, чого я не очікував.

Вміст двох файлів:


~/tmp > ls -l
total 8
-rw-rw-r-- 1 pmn ccusers 116 Dec 11 09:22 1
-rw-rw-r-- 1 pmn ccusers 116 Dec 11 09:23 2
~/tmp >

~/tmp > cat 1
hi
test1      blah, blah, blah:      * blah, blah, blah"
test:      * blah, blah, blah:      * blah, blah, blah
sd
~/tmp >

~/tmp > cat 2
hi
temp:      * blah, blah, blah:      * blah, blah, blah"
temp2:     blah, blah, blah:      * blah, blah, blah
sd
~/tmp >

До речі, наступне схоже на те, що я очікую:


~/tmp > cat * | grep -v -E ":.{6}*"
hi
sd
hi
sd
~/tmp >

Які видалили лінії


test1      blah, blah, blah:      * blah, blah, blah"
test:      * blah, blah, blah:      * blah, blah, blah
temp:      * blah, blah, blah:      * blah, blah, blah"
temp2:     blah, blah, blah:      * blah, blah, blah

(Ви також видалили рядки 1 і 4 вище, які не є тим, чого я хочу - значить, ця команда grep не буде працювати для мене).

Я знаю, як змусити це працювати над PERL; однак, з певних причин я можу використовувати лише grep, awk або sed.

Як змусити це працювати?


@PsychoData

Дякую за Вашу відповідь. Боюся, команда не зробила хитрощів. Ваша команда повернула наступне

~/tmp > cat * | grep -v -E "^[^\S]+:.{6}\*"  
hi  
sd  
hi  
sd  
~/tmp >

що таке саме, як результат, повернутий grep -v -E ":.{6}*"у моєму запитанні, який, однак, не є тим, чого я хотів. Я хотів, щоб команда принесла такий вихід:

hi  
test1      blah, blah, blah:      * blah, blah, blah"  
sd  
hi  
temp2:     blah, blah, blah:      * blah, blah, blah  
sd

ІМХО, ваш вилучив наступні рядки, тому ^[^\S]+:що жадібний збіг, який відповідає якомога більшій частині рядка - який, як ви можете бачити, є найбільш правим ' *' у наступних рядках.

test1      blah, blah, blah:      * blah, blah, blah"  
test:      * blah, blah, blah:      * blah, blah, blah  
temp:      * blah, blah, blah:      * blah, blah, blah"  
temp2:     blah, blah, blah:      * blah, blah, blah

До речі, зауважте, що між кожною :та *парою є рівно 6 пробілів . Я думаю, що форматування робить це важко помітити.

Відповіді:


1

спробуйте grep -v -E "^[^\S]+:.{6}\*"

Добре. Тож, що я роблю з цим, це сказати йому, що я хочу, щоб кожен рядок, який не містить наступного шаблону, включав розширені вирази:

match the start of a line, then [anything EXCEPT whitespace] at least once,then a colon, then 6 characters, then an asterisk

буде показано все, що не відповідає цій схемі


Дякуємо за Ваш відповідь. Команда, яку ви мені дали, не зробила хитрощів. Будь ласка, дивіться мою відповідь нижче для отримання більш детальної інформації.
pmn

1

У розширених регулярних виразах немає способу провести не жадібну відповідність. Однак це можна легко зробити за допомогою PCRE :

$ grep -hvP "^[^\s]+?:\s+\*" *
hi
test1      blah, blah, blah:      * blah, blah, blah"
sd
hi
temp2:     blah, blah, blah:      * blah, blah, blah
sd

Файли вам не потрібно cat, grepможна відкрити їх безпосередньо. -hОпція включає друку імені файлу (необхідно , коли НЕ catІНГ) і -Pповоротів на PCREs. Потім ви шукаєте одного або декількох символів, що не містять пробілів, на початку рядка ^[^\s]+?, а потім - :один, або декілька пробілів ( \s+) і, нарешті, a *(вам потрібно уникнути *іншого, воно розглядається як кількісний показник).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.