Ваш вопрос непонятен. Предположим, вы хотите закомментировать конкретный текст:
sed -i.bak 's/^\(Hellow2\)$/#\1/'
Это произведет замену на месте любых строк, которые точно соответствуют строке «Hellow2», и заменит их на #, за которым следует строка, которая была сопоставлена.
Цитирование $ '...'
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"
Это не строка, это 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
может содержать управляющие символы).