Как извлечь строку между двумя символами? - PullRequest
1 голос
/ 11 июня 2019

У меня есть строка "foo [string] bar", и я хочу извлечь из нее "string", исключив все содержимое до и после.

У моего grep нет опции -P, поэтому я попытался с помощью sed.

echo "foo [string] bar" | sed -n -e '/\[/,/\]/p'

Я получаю полную строку в командной строке.

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

1-е решение: , если вы в порядке с awk, не могли бы вы попробовать потом.

echo "foo [string] bar"  | awk -F"[][]" '{print $2}'

2-е решение: С sed Попробуйте:

echo "foo [string] bar"  | sed 's/\([^[]*\)\[\([^]]*\)\(.*\)/\2/' 

3-е решение:

echo "foo [string] bar"  | awk '{sub(/[^[]*/,"");sub(/\[/,"");sub(/\].*/,"")} 1'

4-е решение: Учитывая, что ваша переменная будет иметь только 1 набор [ и ], если это так, то вам поможет следующий простейший вариант.

echo "foo [string] bar"  | sed 's/.*\[//;s/\].*//'

5-е решение: Использование здесь match функции awk.

echo "foo [string] bar" | awk 'match($0,/\[[^]]*/){print substr($0,RSTART+1,RLENGTH-1)}'
0 голосов
/ 12 июня 2019
echo "foo [string] bar" | awk '{gsub(/\[|\]/,"");print $2}'
string
0 голосов
/ 11 июня 2019

с использованием grep:

echo "foo [string] bar" | grep -oP '\[\K[^]]+' 
string

Если ваш grep поддерживает флаг PCRE (-P), вы можете использовать регулярное выражение для захвата содержимого между [ и ].
Вот разбивка команды:

-o: этот флажок заставит grep печатать ТОЛЬКО соответствующее регулярное выражение, а не всю соответствующую строку.
-P: Это включит PCRE
\[\K[^]]+: \K разрешит сопоставление слева от него, но не рассматривает его как часть вывода.[^]]+ означает, продолжайте идти, если что-то не совпадает с ]

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