як знайти (grep) абзац, починаючи зі слова і закінчуючи іншим словом та ігнорувати новий рядок?


3

Я хочу знайти абзац - це список файлів. Наприклад, оператор SQL, який виглядає так:

upadte b_table
set number = 100014
where id in (
            select number_desc from t_table
            where id > 100);

Як я повинен ігнорувати введення / нові рядки?

Мені потрібно знайти / надрукувати абзац, який починається з "оновлення" і закінчується першим появою ;

Відповіді:


3

Натхненний стислим рішенням Barryj:

perl -ne 'print if /update/../;/' *.sql

Якщо оператори оновлення містяться в (розділених порожнім рядком) абзацах:

perl -00 -ne 'print if /update.*?;/' *.sql

- з http://uselessuseofcat.com/?p=381

В іншому випадку це друкує назви файлів і оновлення операторів:

perl -ne 'BEGIN{undef $/}; print "$ARGV\t$.\t$1\n" if m/(update.*?;)/mg' *.sql

- з http://www.commandlinefu.com/commands/view/5087/multi-line-grep

(неперевірений - застереження емптора)


ОК - я використав grep з regexp, як це:
user84129

3

grep трохи складний з новими рядками, але ви можете спробувати щось із awk:

awk '/update/,/;/' < filename.sql

Як би ви попрацювали з файлом, що містить кілька заяв про оновлення?
RedGrittyBrick

@RedGrittyBrick - Вищенаведений вислів повинен друкувати всі оператори із відповідними частинами початку та зупинки. Я припускаю, що саме це потрібно.
barryj

0

Я використав греп так:

grep -ihRP  '^(update|( )* update) .* [^;]*;'

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