Это не имеет никакого отношения к командной строке, это просто ярлык приложения Gnome Terminal. Этого не произойдет, например, в Xterm.
. Или, чтобы добавить к миксу, решите его, используя awk
:-
awk -F'"' '$1 ~ /HIJK/ {print $2}' aaa.txt
который печатает: -
My name is HIJK
использовать 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
Я бы решил эту проблему в два этапа:
1. После того, как вы grep
ed для шаблона, используйте awk
, чтобы снять деталь перед = знаком:
awk -F = '{print $2}'
2. Затем с помощью rev
и cut
:
rev | cut --complement -c 1 | rev | cut --complement -c 1
Summary: удалите "знаки со старым трюком Unix". Чтобы собрать все вместе, можно использовать следующую команду для получения результирующей строки:
grep "HIJK" filename | awk -F = '{print $2}' | rev | cut --complement -c 1 | rev | cut --complement -c 1
Если вы хотите поместить результат в переменную, можно использовать эту команду:
VARIABLE="$(grep "HIJK" filename | awk -F = '{print $2}' | rev | cut --complement -c 1 | rev | cut --complement -c 1)"
Это должно сработать (только sed
, нет grep
):
VAR=$(sed 's/.*"\([^\"]*HIJK[^\"]*\)\"/\1/g' aaa.txt)
Содержимое переменной:
echo $VAR
My name is HIJK
Если необходимо установить переменную, как указано в aaa.txt, то можно просто использовать eval.
Например:
$ grep HJIK aaa.txt
HJIK="My name is HJIK"
$ eval $(grep HJIK aaa.txt)
$ echo $HJIK
My name is HJIK
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 "HIJK" aaa.txt | grep -oP '(?<==").*(?=")'
My name is HIJK
Если ваш исходный grep
гарантированно будет текстом до =
, то вы можете сократить это до:
$ grep -oP '(?<=HIJK=").*(?=")' aaa.txt
My name is HIJK
что-то вроде:
VAR=$(sed -n '/HIJK=/s/HIJK="\([^"]*\)"/\1/p' aaa.txt)
Не печатайте строки по умолчанию (-n
), но на строках, соответствующих HJIK=
(/HJIK=/
), замените HJIK="(что-то, не содержащее двойных кавычек)"
на (что-то, не содержащее двойных кавычек)
: s/HIJK="\([^"]*\)"/\1/
и распечатать их - флаг p
.