Использование переменных в строке

Ваш вопрос непонятен. Предположим, вы хотите закомментировать конкретный текст:

sed -i.bak 's/^\(Hellow2\)$/#\1/'

Это произведет замену на месте любых строк, которые точно соответствуют строке «Hellow2», и заменит их на #, за которым следует строка, которая была сопоставлена.

1
27.05.2016, 13:06
2 ответа

Цитирование $ '...' ANSI-C приводит к строке "в одинарных кавычках".
Внутри одиночных кавычек строковые переменные не раскрываются:

$ var=13

$ echo 'test $var'
test $var

Вам нужно взять переменную из такой структуры. Самый простой способ IMO:

$  printf -v val '%s 2\n3 4\n5 6\nq' "$var"
13 2
3 4
5 6
q

Формат printf очень похож на тот, что был у вас раньше, а % s заменяется значением переменной. Чтобы получить результат в переменной, мы можем использовать возможности bash printf по установке переменной:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"
$ script <<< "$val"

Все в одной строке:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"; script <<< "$val"
0
27.01.2020, 23:13

Это не строка, это ANSI-C цитирование:

Слова вида $'string' обрабатываются особым образом. ... Расширенный результат заключается в одинарные кавычки, как если бы знака доллара не было.

Таким образом, справа от <<< у вас есть строка с одинарными кавычками. Эта строка принимается за строку here, без дальнейшей обработки.

Однако нет необходимости использовать только один набор кавычек вокруг всего слова. Вы можете использовать несколько частей, заключенных в кавычки (или отдельные слова без кавычек), соединенных вместе:

script <<< "$var 2"$'\n'"3 4"$'\n'"5 6"$'\n'q

сделает то, что вы хотели.

В качестве альтернативы вы можете использовать обратную косую черту - пробелы, а не кавычки "1 2".


Вы также можете использовать echo -e с обычной трубой:

echo -e "$var 2\n3 4\n5 6\nq" | script

или printf:

printf '%s 2\n3 4\nq' "$var" | script

-e необходимо для того, чтобы включить обработку пробелов в аргументах echo. printf делает это по умолчанию, но имеет свою собственную систему интерполяции (printf "$var 2\n3 4\nq" тоже будет работать, но проблематично, если $var может содержать управляющие символы).

7
27.01.2020, 23:13

Теги

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