Я намагаюся використовувати розширений параметр регулярного вираження в 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 пробілів . Я думаю, що форматування робить це важко помітити.