grep во вложенных скобках - PullRequest
0 голосов
/ 03 мая 2018

Как мне перебирать строки между вложенными скобками, используя bash? Возможно ли это без использования петель? Например, если у меня есть строка вроде:

[[TargetString1: SomethingIDontWantAfterColon [[TargetString2]]]]

Я хочу выполнить grep только для двух целевых строк внутри [[]]:

TargetString1
TargetString2

Я попробовал следующую команду, которая не может получить TargetString2

grep -o -P '(?<=\[\[).*(?=\]\])'|cut -d ':' -f1

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вы можете использовать grep regex grep -Eo '\[\[\w+' | sed 's/\[\[//g' для этого

[root@localhost ~]# echo "[[TargetString1:SomethingIDontWantAfterColon[[TargetString2]]]]" | grep -Eo '\[\[\w+' | sed 's/\[\[//g'
TargetString1
TargetString2
[root@localhost ~]#
0 голосов
/ 03 мая 2018

С опцией GNU grep P:

grep -oP "(?<=\[\[)[\w\s]+"

Регулярное выражение будет соответствовать последовательности символов слова (\w+), за которой следует две скобки ([[). Это работает для вашей примерной строки, но не будет работать для более сложных конструкций, таких как:

[[[[TargetString1]]TargetString2:SomethingIDontWantAfterColon[[TargetString3]]]]

, где сопоставляются только TargetString1 и TargetString3.

0 голосов
/ 03 мая 2018

Чтобы извлечь из вложенных [[]] скобок, вы можете использовать sed

#!/bin/bash

str="[[TargetString1:SomethingIDontWantAfterColon[[TargetString2]]]]"

echo $str | grep -o -P '(?<=\[\[).*(?=\]\])'|cut -d ':' -f1
echo $str | sed 's/.*\[\([^]]*\)\].*/\1/g' #which works only if string exsit between []

Выход:

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