
У меня есть строка, которая берется из файла через:
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