Фільтрація певних рядків із стандартного вводу


-1

Мені потрібна команда Unix, яка візьме трубопровідний вхід, відфільтрує певні рядки і запише решту до стандартного виводу. Проблема полягає в тому, що вона повинна бути однорядковою командою, яка не залежить від нічого, що не виходить з коробки в типовому дистрибутиві Linux.

Контекст полягає в тому, що 'llvm-config --libs' посилається на пару тестових файлів, які він не повинен, і мені потрібно їх усунути, але мені потрібно це зробити з configure.ac.

І поворот полягає в тому, що це не один елемент на рядок, це всі елементи в одному рядку, розділені пробілами, а не новими рядками.

Відповіді:


1

grepє досить поширеною командою Unix / Linux, принаймні, я ще не стикався з будь-яким дистрибутивом, який мені довелося спеціально встановити основну grep(проти сказати egrepчи іншу команду фільтра).

взяти трубопровідний вхід, відфільтрувати певні рядки та записати решту до стандартного виводу.

Щоб використовувати його так, щоб його відфільтрувати, ви можете зробити наступне (якщо припустити, що ви використовуєте catдля друку файлу на стандартний вихід)

cat "some_file.txt" | grep -v "text to omit"

Крім того, grepтакож працює і файли, так що вищевказана команда може бути просто записана як така:

grep -v "text to omit" "some_file.txt"

-vПрапор вказує grepна друк всі , крім зазначеного тексту. Якщо ви хочете шукати регістр, вам потрібно вказати -iпрапор.

це не один елемент на рядок, це всі елементи в одному рядку, розділені пробілами, а не новими рядками.

Для цього ви можете додати цикл for itterate над словами та все ще використовувати grep, щоб досягти того, що вам потрібно, наприклад:

for word in "hello there how" are you how "am i today"; do echo $word; done | grep -v "how"

Вихід для цього буде:

are
you
am i today

І щоб вивести його в один рядок, ви можете скористатися trкомандою для перекладу на \nпробіл:

for word in "hello there how" are you how "am i today"; do echo $word; done | grep -v how | tr '\n' ' '

Тут результат буде:

are you am i today 

Перша частина for word in- це сценарій оболонки for loop. Посилаємося специфічний для BASHале синтаксис дуже схожий серед інших оболонок (принаймні , для CSH, KSHі ASH), так що ви , можливо , доведеться налаштувати , щоб мати синтаксис відповідає вашій конкретній оболонки.

Сподіваюся, що це може допомогти.


Ах! Дійсно, якби введення було одним елементом на рядок, але це не так, це всі елементи в одному рядку, розділені пробілами, а не новими рядками. Я краще додам це як уточнення до питання.
rwallace

@rwallace, оновив мою відповідь на ваше оновлене запитання :)
txtechhelp

Дякую, це виглядає перспективно! Чи є спосіб згодом повернути вихідний формат в однорядковий формат? Або оскільки він повинен опинитися в makefile, можливо, я можу зробити щось на зразок додавання зворотної косої риски до кожного рядка.
rwallace

... на жаль, додавання зворотної косої риски до кожного рядка не працює, тому що вона повинна опустити звороту косу рису з останнього рядка.
rwallace

Ще раз модифікована відповідь, просто труба, яка виводиться на tr... наприклад:for word in blah blah blah; do echo $word; done | grep -v omit | tr '\n' ' '
txtechhelp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.