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

Это не имеет никакого отношения к командной строке, это просто ярлык приложения Gnome Terminal. Этого не произойдет, например, в Xterm.

.
1
26.06.2014, 02:43
7 ответов

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

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

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

My name is HIJK
1
27.01.2020, 23:38

использовать 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
27.01.2020, 23:38

Я бы решил эту проблему в два этапа:

1. После того, как вы greped для шаблона, используйте 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)"
0
27.01.2020, 23:38

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

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

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

echo $VAR
My name is HIJK
0
27.01.2020, 23:38

Если необходимо установить переменную, как указано в aaa.txt, то можно просто использовать eval.

Например:

$ grep HJIK aaa.txt
HJIK="My name is HJIK"
$ eval $(grep HJIK aaa.txt)
$ echo $HJIK
My name is HJIK
0
27.01.2020, 23:38

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
0
27.01.2020, 23:38

что-то вроде:

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

Не печатайте строки по умолчанию (-n), но на строках, соответствующих HJIK= (/HJIK=/), замените HJIK="(что-то, не содержащее двойных кавычек)" на (что-то, не содержащее двойных кавычек): s/HIJK="\([^"]*\)"/\1/ и распечатать их - флаг p.

.
0
27.01.2020, 23:38

Теги

Похожие вопросы