Получить текст между двумя специальными символами в строке с помощью оболочки

Получить текст между двумя специальными символами в строке с помощью оболочки

У меня есть строка, которая берется из файла через:

cat aaa.txt | grep "HIJK"

На выходе получаем:

HIJK="My name is HIJK"

Мне нужно поместить текст My name is HIJKв переменную в скрипте оболочки.

Я попробовал это, но это не работает:

cat aaa.txt | grep "HIJK" | sed -n '/\"/,/\"/p'

решение1

Или, чтобы добавить в смесь, решите ее, используя awk:-

awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt

который печатает:-

My name is HIJK

решение2

использовать IFSдля этого

$ IFS=\= read var1 var2 <<< $(grep "HIJK" aaa.txt)
$ echo $var1
HIJK
$ echo $var2
"My name is HIJK"
$ var2="${var2%\"}" // remove double quotes on both sides
$ var2="${var2#\"}"
$ echo $var2
My name is HIJK

решение3

sedс базовым регулярным выражением:

$ grep "HIJK" aaa.txt | sed 's/.*="\(.*\)"/\1/g'
My name is HIJK

sedс расширенным регулярным выражением:

$ grep "HIJK" aaa.txt | sed -r 's/.*="(.*)"/\1/g'
My name is HIJK

Двойные кавычки не нужно экранировать, так как они уже находятся внутри одинарных кавычек (и, следовательно, будут рассматриваться как литералы, поскольку не являются специальными).

Вы также можете использовать, grep -oPесли ваша версия grepподдерживает это:

$ grep "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK

Если ваш инициал grepгарантированно будет текстом перед =, вы можете сократить его до:

$ grep -oP '(?<=HIJK=").*(?=")' aaa.txt
My name is HIJK

решение4

Это должно работать (только sed, нет grep):

VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)

Содержимое переменной:

echo $VAR
My name is HIJK

Связанный контент