Различное поведение sed по отношению к массиву и строке при наличии обратной косой черты

pip - диспетчер пакетов Python. Он установит только модули / пакеты python.

yum - это старый инструмент установки Fedora / RedHat, который устанавливает пакеты RPM и выполняет разрешение зависимостей за вас.

dnf - это новая замена yum

Что касается других, если вы считаете pip , то конечно, есть также материал CPAN Perl, драгоценные камни для ruby, npm для JavaScript. Наверняка многие многие другие.

1
08.02.2014, 01:35
2 ответа
a=("foo\\\\ bar") 

дает значение для $ {a [0]} :

"foo\\ bar"

, которое отправляется на sed , который затем ищет:

"foo\ bar"

, который не соответствует ни одной строке во входных данных.

1
29.04.2021, 00:42

man bash объясняет опасности использования двойных кавычек:

  Заключение символов в двойные кавычки перед - 
служит буквальным значением всех символов { {1}} в кавычках, за исключением $, `, 
 \, и, когда включено раскрытие истории,!. 
Символы $ и` сохраняют свои особые {{1} } значение в двойных кавычках. Обратная косая черта 
сохраняет свое особое значение только в том случае, если за ней следует 
один из следующих символов: $, `,", 
 \ или . Двойные кавычки могут быть заключены в кавычки 
в двойных кавычках, поставив перед ним обратную косую черту 
. Если этот параметр включен, раскрытие истории будет 
выполняться, если только! В двойных кавычках 
не будет экранирован с помощью обратной косой черты . Обратная косая черта 
перед! Не удаляется.
 

Другими словами, используйте двойные кавычки вокруг переменной bash, если вы хотите, чтобы bash обрабатывал знаки доллара, обратные кавычки, обратную косую черту и восклицательные знаки.

Если вы хотите, чтобы строка, передаваемая в sed, не была запутана, используйте одинарные кавычки, как в первом примере. man bash объясняет:

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

В общем, есть две альтернативы. Один использует одинарные кавычки при определении a :

$ a=('foo\\\\ bar')
$ b=(someotherstuff)
$ sed  "s/${a[0]}/${b[0]}/gI" foo.txt
someotherstuff baz 
xxx

, а второй использует двойные кавычки при определении a :

$ a=("foo\\\\\\\\ bar")
$ sed  "s/${a[0]}/${b[0]}/gI" foo.txt
someotherstuff baz 
xxx

Для последнего требуется восемь обратных косых черт. Поскольку вы хотите заменить две обратные косые черты, вы должны предоставить sed четыре обратных косых черты. Чтобы предоставить sed четыре, вы должны предоставить bash при использовании двойных кавычек с восемью.

3
29.04.2021, 00:42

Теги

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