Подтвердить что ты не робот

Извлечь строку из скобок

Я новичок в bash, так что это довольно пустой вопрос.

Предположим, что у меня есть строка:

string1 [string2] string3 string4

Я хотел бы извлечь string2 из квадратных скобок; но скобки могут быть связаны с любой другой строкой в ​​любое другое время.

Как я могу использовать sed и т.д., чтобы сделать это? Спасибо!

4b9b3361

Ответ 1

Попробуйте следующее:

echo $str | cut -d "[" -f2 | cut -d "]" -f1

Ответ 2

Здесь один из способов использования awk:

echo "string1 [string2] string3 string4" | awk -F'[][]' '{print $2}'

Этот параметр sed также работает:

echo "string1 [string2] string3 string4" | sed 's/.*\[\([^]]*\)\].*/\1/g'

Здесь пробой команды sed:

s/          <-- this means it should perform a substitution
.*          <-- this means match zero or more characters
\[          <-- this means match a literal [ character
\(          <-- this starts saving the pattern for later use
[^]]*       <-- this means match any character that is not a [ character
                the outer [ and ] signify that this is a character class
                having the ^ character as the first character in the class means "not"
\)          <-- this closes the saving of the pattern match for later use
\]          <-- this means match a literal ] character
.*          <-- this means match zero or more characters
/\1         <-- this means replace everything matched with the first saved pattern
                (the match between "\(" and "\)" )
/g          <-- this means the substitution is global (all occurrences on the line)

Ответ 3

В чистом bash:

STR="string1 [string2] string3 string4"
STR=${STR#*[}
STR=${STR%]*}
echo $STR

Ответ 4

Здесь другой, но он заботится о нескольких вхождениях, например

$ echo "string1 [string2] string3 [string4 string5]" | awk -vRS="]" -vFS="[" '{print $2}'
string2
string4 string5

Простая логика заключается в том, что вы разделились на "]" и переходите через разделенные слова, находя "[", а затем разделите "[", чтобы получить первое поле. В Python

for item in "string1 [string2] string3 [string4 string5]".split("]"):
    if "[" in item:
       print item.split("]")[-1]

Ответ 5

Укажите awk несколько разделителей с -F '[разделителями]'

Если разделители являются квадратными скобками, верните их обратно назад, как показано на рисунке ] [

awk -F '[][]' '{print $2}'

в противном случае вам придется избегать их

awk -F '[\\[\\]]' '{print $2}'

Другие примеры для получения значения между скобками:

echo "string1 (string2) string3" | awk -F '[()]' '{print $2}'
echo "string1 {string2} string3" | awk -F '[{}]' '{print $2}'

Ответ 6

Решение Inline может быть:

a="first \"Foo1\" and second \"Foo2\""
echo ${a#*\"} | { read b; echo ${b%%\"*}; }

Вы можете протестировать в одной строке:

a="first \"Foo1\" and second \"Foo2\""; echo ${a#*\"} | { read b; echo ${b%%\"*}; }

Выход: Foo1

Пример с помощью скобок:

a="first [Foo1] and second [Foo2]"
echo ${a#*[} | { read b; echo ${b%%]*}; }

Это в одной строке:

a="first [Foo1] and second [Foo2]"; echo ${a#*[} | { read b; echo ${b%%]*}; }

Выход: Foo1

Ответ 7

Read file in which the delimiter is square brackets:
$ cat file
123;abc[202];124
125;abc[203];124
127;abc[204];124

To print the value present within the brackets:
$ awk -F '[][]' '{print $2}' file
202
203
204

С первого взгляда разделитель, используемый в приведенной выше команде, может ввести в заблуждение. Это просто. В этом случае должны использоваться 2 разделителя: один - [, а другой -]. Поскольку сами разделители являются квадратными скобками, которые должны быть помещены в квадратные скобки, в первом случае это выглядит сложным.

Примечание. Если квадратные скобки являются разделителями, их следует поместить только таким образом, что означает first], а затем [. Использование разделителя типа -F '[[]]' даст совсем другую интерпретацию.

Перейдите по этой ссылке: http://www.theunixschool.com/2012/07/awk-10-examples-to-read-files-with.html

Ответ 8

Вот пример awk, но я сопоставляю в скобках, что также делает более очевидным, как работает -F.

echo 'test (lskdjf)' | awk -F '[()]' '{print $2}'