Bash echo -e эквивалент с использованием sed и tee

Я делаю поиск/замену с помощью sed и используя tee для записи выходного файла. Вот команда

    # $1 source
    # $2 Type
    # $3 name 
    # $4 body 

    sudo sed  "s/<!--ID-->/1/g"  ./templates/tpl.txt \
        | sed  "s/<!--AUTHOR-->/myname/g"  \
        | sed  "s/<!--TYPE-->/$2/g"  \
        | sed  "s/<!--BODY-->/$4/g"  \
        | sed  "s/<!--NAME-->/$3/g"  \
        | tee  "$3.txt" > /dev/null

В выходном файле вместо новых строк я вижу «n». Мне нужен тот же эффект, что и в следующем (но после замены шаблона)

 echo -e "$4" > "$3.txt"

Я участвую в bash и помогу мне представить свой код

редактировать

$ 4 содержит многострочную строку (например, MySQL функция/процедура или триггер ) с комментариями и т. д.

благодаря

0
nl ja de
моя версия bash GNU bash, версия 3.2.48 (1) -release (x86_64-apple-darwin10.0) Авторское право (C) 2007 Free Software Foundation, Inc. , не знает, как проверить версию sed
добавлено автор sakhunzai, источник
Какую версию sed , bash и какую ОС вы используете?
добавлено автор F. Hauri, источник
Итак, вы можете попробовать мою последнюю добавленную версию (для Mac)
добавлено автор F. Hauri, источник

1 ответы

Если вы собираетесь использовать tee для написания привилегированных файлов, вы должны использовать sudo с tee .

Ты мог:

sed < template/tpl.txt -e "
    s/<!--ID-->/1/g;
    s/<!--AUTHOR-->/myname/g;
    s/<!--TYPE-->/$2/g;
    s/<!--NAME-->/$3/g;
    /<!--BODY-->/{s/<!--BODY-->/$4/;s/\\n/\n/g;}
  " | sudo tee "$3" >/dev/null

другим способом: в вы можете использовать:

echo "${4//\\n/$'\n'}" 

так:

sed "s/<!--BODY-->/${4//\\n/$'\n'}/;"

может работать тоже.

С Mac sed это может работать лучше:

sed < template/tpl.txt "s/<\!--ID-->/1/g;
     s/<\!--AUTHOR-->/myname/g;
     s/<\!--TYPE-->/$2/g;
     s/<\!--BODY-->/${4//\\n/\\$'\n'}/
  " | sudo tee "$3" >/dev/null

Объяснение: $ {4//\\ n/\\ $ '\ n'} являются bashism , мы могли бы использовать, используя . Mac sed не поддерживает \ n в качестве новой строки, но поддерживает новую строку, если выполняется с помощью обратного слэша \ , поэтому в RHS , \ n может быть записано (в bash): \\ $ '\ n' :

echo abc\\$'\n'def
abc\
def
0
добавлено
как насчет других специальных символов, например LF/CRLF и вкладок?
добавлено автор sakhunzai, источник
Я не понимаю эту часть: //{s//$ 4 /; s/\\ n/\ n/g;}
добавлено автор sakhunzai, источник
ваш предложенный код не работает, я на Mac OS 10.6
добавлено автор sakhunzai, источник
Я попробовал sht, как этот body = $ (echo -e "$ 4") и output = $ (sed -e "s//$ changesetID/g "./templates/mysql_obj.xml \ | sed" s//$ author/g "\ | sed" s//$ 2/g "\ | sed "s//$ body /" \ | sed "s//$ 3/g");
добавлено автор sakhunzai, источник
и вывод sed: 1: "s//CREAT ...": unescaped newline внутри шаблона замены
добавлено автор sakhunzai, источник
Это операционный блок , ограниченный {...} , который должен выполняться в месте, где /.../ соответствует. U может заменить grep blah на: sed -ne "/ blah/p" для образца.
добавлено автор F. Hauri, источник
С помощью Mac 'sed, попробуйте следующее: sed "s/<\! - BODY ->/$ {4//\\ n/\\ $' \ n '} /"
добавлено автор F. Hauri, источник
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.