Как сопоставить вложенный текст с префиксом пробелов в sed или grep - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сопоставить вложенный текст, включая строку непосредственно перед вложенным текстом, с помощью sed или grep.

Пример того, с чем я работаю:

pattern3
    abcde
    fghij
pattern3
pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern3
    abcde
pattern1
    pqrst
patterh3
    fghij

Обратите внимание, что всегда есть четыре (4) пробела перед префиксом вложенного текста.Кроме того, после сопоставления с шаблоном может быть или не быть вложенного текста.

Мне интересны все pattern1 строки плюс строки, следующие за pattern1, за которыми следуют пробелы.

Вывод, который я ищу:

pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern1
    pqrst

Я подошел ближе:

sed -n '/^pattern1/,/^pattern1/p' data.txt

Но кажется, что пропущенный вложенный текст после совпадения правой стороны pattern1,и перейдем к следующей итерации.

Я также попытался sed -n '/^\"pattern1\"$/,/^\"pattern1\"$/p' data.txt | sed '1d;$d', но тоже не повезло.

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Это может сработать для вас (GNU sed):

sed '/^\S/h;G;/pattern1/P;d' file

Сохранить текущий шаблон в области удержания и добавить его к каждой строке.Если текущим шаблоном является pattern1, выведите текущую строку и / или удалите текущую строку.

0 голосов
/ 19 сентября 2018

Не могли бы вы попробовать следующее.

awk '/pattern[23]/{flag=""} /pattern1/{flag=1} flag'  Input_file

ИЛИ

awk '/pattern[^1]/{flag=""} /pattern1/{flag=1} flag'  Input_file

Объяснение: Добавление объяснения тоже здесь.

awk '
/pattern[^1]/{        ##Checking condition if a line is having string pattern with apart from digit 1 in it then do following.
  flag=""             ##Nullifying variable flag value here.
}
/pattern1/{           ##Checking condition here if a line is having string pattern1 then do following.
  flag=1              ##Setting value of variable flag as 1 here.
}
flag                  ##Checking condition if value of flag is NOT NULL then print the line value.
' Input_file          ##Mentioning Input_file name here.
0 голосов
/ 19 сентября 2018
$ awk '/^[^ ]/{f=/^pattern1$/} f' file
pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern1
    pqrst
0 голосов
/ 19 сентября 2018

С GNU sed:

sed -n '/pattern1/{p;:x;n;s/^    .*/&/;p;tx}' file

или упрощенно:

sed -n '/pattern1/{p;:x;n;p;/^    /bx}' file

Вывод:

pattern1
    abcde
    fghij
pattern1
pattern1
    klmno
pattern1
pattern1
    pqrst
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...