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/'${arrayLMEs}'/' -   -  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 променлива със стойността на вашата променлива на shell $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