Awk / sed извлекает информацию при совпадении с шаблоном из абзаца

Прежде всего, Одинарные кавычки не могут находиться между одинарными кавычками, даже если им предшествуют обратной косой чертой. , ссылка Руководство по Bash

Во-вторых, вы можете использовать какой-нибудь другой символ в качестве разделителя вместо / , как у вас есть / в строке замены.

Итак, в результате:

sudo sed "s#listen = 127.0.0.1:9000#listen = '/var/run/php56-fpm.sock'#g" /etc/php-fpm.d/www.conf

пока не используйте -i , посмотрите распечатку, чтобы проверить, работает ли она должным образом.

4
18.03.2016, 12:51
2 ответа

TXR решение:

@(define word (w))@{w /[^,\s()]+/}@(end)
@(collect)
@  (cases)
CREATE VIEW @view@/ /
@  (or)
CREATE VIEW @view
@  (end)
@  (collect)
@    (coll :vars (table))@\
       FROM @(word first-tbl)@\
       @(coll :vars (rest-tbl) :gap 0)@\
         @/\s*,\s*/@(word rest-tbl)@\
         @(maybe) as @(word something)@(end)@\
       @(end)@\
       @(merge table first-tbl rest-tbl)@\
     @(end)
@  (until)
CREATE@(skip)
@  (end)
@  (flatten table)
@(end)
@(output)
@  (repeat)
@    (repeat)
@view;@table
@    (end)
@  (end)
@(end)

Выполнить:

$ txr extract.txr data
view1;table1
view1;table2
view1;table3
view1;table4
view1;table5
view1;table6
view2;table1
view2;table2
view2;table6
view2;table4
view2;table5
view2;table7
view2;table4
view2;table5
view2;table8

Обратите внимание, что если as встречается как AS , это должно быть включено в код; например, используя @ / [Aa] [Ss] / .

0
27.01.2020, 20:59

Редактировать: забыл первую строку (поэтому я изменил L++ на ++L): Edit2: исправлено регулярное выражение, чтобы не «подставлять» всю скобку до последнего FROM

. Возможно, мы сможем «творчески» использовать разделение полей, чтобы избавиться от того, что мы не хотим сохранять, и просто получить имена таблиц:

$ LC_ALL="C" awk -v csvsep=';' -v separators='FROM *| *, *| +as[^,]*| *[(][^()]*FROM *| *[)] *'  '
   /CREATE VIEW/ { name=$NF }
   /FROM / { nb=split($0,tables,separators);
             for(i=1;i<=nb;i++) {
               (tables[i]~/[A-Za-z]/) ? line[++L]=name csvsep tables[i] : rem="Otherwise nothing to add" }
           }
   END  { for(i=1;i<=L;i++) { print line[i] } }'

Затем мы загружаем его:

CREATE VIEW view1
AS something
FROM table1 ,table2 as A, table3 (something FROM table4)
FROM table5, table6
USING file1
;
CREATE VIEW view2
FROM table1 ,table2 ,table6 ,table4
something
something
FROM table5 ,table7 (something FROM table4 ,table5(this is something FROM table8)
USING file2
;

И это дает ожидаемое:

view1;table1
view1;table2
view1;table3
view1;table4
view1;table5
view1;table6
view2;table1
view2;table2
view2;table6
view2;table4
view2;table5
view2;table7
view2;table4
view2;table5
view2;table8

Примечание: мы просто обрабатываем строки, содержащие «FROM», поэтому, если у вас есть творческие строки FROM (на нескольких строках...), это не будет работать без некоторых больше магии.

2
27.01.2020, 20:59

Теги

Похожие вопросы