Извлечь строку из квадратных скобок

63
7

Мне нужно получить значение myfile.ext из этой строки примера: 'My message [file:myfile.ext]'

Я видел подобный вопрос, но не смог заставить строку возвращать пустую строку, если скобки не находятся в строке.

Мне нужно проверить, содержит ли строка [file:***] и возвращает переменную *** иначе должно быть пустое значение.

спросил(а) 2021-01-25T15:08:42+03:00 4 месяца, 4 недели назад
1
Решение
88

Вы можете использовать grep для этого:

$ grep -Po '(?<=\[file:)[^]]*(?=])' file
myfile.ext

Это то же самое, что (в зависимости от того, читаете ли вы из файла или трубопровода):

$ echo "'My message [file:myfile.ext]'" | grep -Po '(?<=\[file:)[^]]*(?=])'
myfile.ext

объяснение

Он ищет строку, идущую после [file: и до следующего ]. Чтобы сохранить его в переменной, используйте выражение var=$(command):

result=$(grep -Po '(?<=\[file:)[^]]*(?=])' file)

он будет пустым по умолчанию, а myfile.ext противном случае.

Образец

$ cat a
My message [file:myfile.ext
My message [file:myfile.ext]]a]

$ grep -Po '(?<=\[file:)[^]]*(?=])' a
myfile.ext

ответил(а) 2021-01-25T15:08:42+03:00 4 месяца, 4 недели назад
88

Вы можете использовать флаг -n sed для подавления печати всех строк, а затем специально использовать флаг p в регулярном выражении для печати соответствия:


sed -n 's/\[file:\([^\]*\)]/\1/p' file

ответил(а) 2021-01-25T15:08:42+03:00 4 месяца, 4 недели назад
63

Вы можете использовать это регулярное выражение BASH:

[[ "$s" == *[* ]] && [[ "$s" =~ \[[^:]*:([^\]]+)\] ]] && echo "${BASH_REMATCH[1]}"
myfile.ext

ответил(а) 2021-01-25T15:08:42+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема