Perl для замены строки строкой, содержащей пробелы и двойные кавычки

Мой сценарий bash создает строковую переменную $arrayLMEs, содержащую строку вида:

var availableTags=[ "01 East Bering Sea", "02 Gulf of Alaska"];

Мне нужно поместить эту строку в код javascript, чтобы заменить заполнитель. Я думал использовать что-то вроде:

perl -i -pe 's/PLACEHOLDER/'"${arrayLMEs}"'/' filename

Но на самом деле команда жалуется из-за найденных в строке двойных кавычек, которые портят команду bash и, как следствие, команду perl.

Как я могу исправить команду, чтобы сохранить пробелы и двойные кавычки?


person Bruno von Paris    schedule 10.06.2015    source источник
comment
Я не вижу никаких проблем при работе на bash в Linux: arrayLMEs='var availableTags=[01 Восточное Берингово море, 02 Залив Аляска];'; эхо --PLACEHOLDER-- | perl -pe 's/PLACEHOLDER/'${массивLMEs}'/' -   -  person dolmen    schedule 10.06.2015
comment
Я должен сказать, что мои строки генерируются. Поэтому я предполагаю, что кавычки удаляются при передаче от команды к другой.   -  person Bruno von Paris    schedule 11.06.2015


Ответы (2)


Используйте переключатель -s, чтобы передать переменную в perl:

perl -spe 's/PLACEHOLDER/$var/' -- -var="$arrayLMEs" filename

-- означает конец аргументов командной строки. -var="$arrayLMEs" устанавливает переменную perl со значением вашей переменной оболочки $arrayLMEs.

В качестве альтернативы вы можете использовать awk:

awk -v var="$arrayLMEs" '{sub(/PLACEHOLDER/, var)}1' filename

Приятным побочным эффектом использования awk является замена простой строки, поэтому метасимволы в исходной строке не будут интерпретироваться.

person Tom Fenech    schedule 10.06.2015
comment
Отличные объяснения! Спасибо - person Bruno von Paris; 10.06.2015
comment
Это оригинальное решение. Я никогда не думал об использовании -s для однострочников! - person dolmen; 10.06.2015

Для справки, я нашел обходной путь (но не такой хороший, как решение Тома Фенека).

  1. Сохраните переменную в файл

    echo $arrayLMEs > tmpfile

  2. используйте sed, чтобы вставить содержимое файла в целевой файл

    sed -i '/PLACEHOLDER/{ r tmpfile d }' filename

Я полагаю, что он довольно крепкий. Недостаток: заставляет создавать другой файл на лету.

person Bruno von Paris    schedule 10.06.2015