Как заменить строки переменных специальными символами в sed [duplicate]

Вот что мне нужно было сделать ...

Во-первых, удалите пакет nodejs, установленный из EPEL:

sudo yum remove nodejs

Перечислите ваши репозитории yum:

yum repolist

Вот как выглядела моя запись репозитория узла:

 nodesource / x86_64 Пакеты Node.js для Enterprise Linux 7 - x86_64 
 

Если вам интересно, перечислите пакеты в репозитории узлов:

yum --disablerepo="*" --enablerepo="nodesource" list available

Затем выполните установку yum, используя только репозиторий узлов:

yum --disablerepo="*" --enablerepo="nodesource" install nodejs

Я подозреваю, что в схеме нумерации, используемой в репозитории узлов, есть что-то, что не представляет nodejs в качестве замены пакета в репозитории EPEL, но это всего лишь предположение.

2
07.01.2017, 21:13
2 ответа

Вы можете использовать любой символ в качестве разделителя команд s , например,

sed -i -e "s|$answer|$FORME $answer|g" ~$answer.txt
8
27.01.2020, 21:52

Удивительно, но этот вопрос задают и отвечают на него по всему Stack Exchange, но два обычно полезных ответа на этот очень резонный вопрос — это иголки в стоге сена. Они:

1. Экранируйте только 4 возможных специальных символа в вашей переменной

Как указано здесь (, несмотря на то, что вопрос стал жертвой отвращения SE к общим вопросам ), только 4 символа считаются специальными в замещающей части команды sed s:\, &, новая строка и разделитель (обычно /, но на самом деле могут быть чем угодно ).

Таким образом, чтобы использовать произвольную переменную в качестве замены в sed, сначала избегайте любых вхождений этих четырех символов, например так:

REPL='Arbitrary variable potentially with special characters like / and & and \ and 
newline\
newline2'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
hexdump -C <<< "$REPL"

Например:

REPL='/&\ 
newline'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
sed "s/x/$REPL/" <<< "STARTxEND"

производит:

START/&\ 
newlineEND

как и ожидалось.

2. Используйте эквивалентный инструмент, который дословно интерпретирует замещающую переменную

perl(ref)имеет эту возможность, потому что переменные (при условии, что они являются частью среды путем их экспорта или установки их в строке вызова ), являются гражданами первого класса. Примечание \Qне требуется в строке замены (, но полезно в строке регулярного выражения ).

export REPL='/&\ 
newline'
perl -pe 's/x/$ENV{REPL}/' <<< "STARTxEND"

производит:

START/&\ 
newlineEND

awk,несмотря на ссылка , нет.

2
27.01.2020, 21:52

Теги

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