2015-05-24 2 views
-1

Я хотел бы добавить указанную строку в файл, в то время как это может показаться легкой задачей - и, безусловно, я изо всех сил стараюсь сделать это. Вот мой сценарий:Как добавить строку в текст с помощью sed или awk

TOMCAT_HOME=/home/osiris/Documents/work/sbr-brms/tomcat-script/apache-tomcat-8.0.22 

    BUSINESS_CENTRAL_USERS="<role rolename=\"admin\"/> 
    <role rolename=\"analyst\"/> 
    <user username=\"bpmAdmin\" password=\"password1!\" roles=\"admin,analyst\"/>" 

    #sed 's,<\/tomcat-users>, $BUSINESS_CENTRAL_USERS <\/tomcat-users>,' $TOMCAT_HOME/conf/tomcat-users.xml 

#sed "s,<\/tomcat-users>, $BUSINESS_CENTRAL_USERS <\/tomcat-users>," $TOMCAT_HOME/conf/tomcat-users.xml 

# awk -v r=$BUSINESS_CENTRAL_USERS '{ /<\/tomcat-users>/{print r}1}' $TOMCAT_HOME/conf/tomcat-users.x 

Первая СЕПГ команда не получает переменный Баш решена, так что только печатает $ BUSINESS_CENTRAL_USERS

Второй СЕПГ команда заканчивается: СЭД: -e выражение # 1, char 45: команда unterminated `s

Третья команда awk заканчивается на: awk: cmd. line: 1: rolename = "admin" /> awk: cmd. line: 1:^Синтаксическая ошибка

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

любые советы приветствуются

Это оригинальный вход http://pastebin.com/ZbTWmn7m Это должно быть ожидаемый выход http://pastebin.com/Gxtptuq3

+0

Что такое вход и ожидаемый выход? –

+0

Это входной файл http://pastebin.com/ZbTWmn7m, и это должен быть ожидаемый вывод http://pastebin.com/Gxtptuq3 –

+0

Чтобы быть совершенно ясным, мне все равно, выполняется ли это sed/awk или любой другой стандартной утилиты linux, просто подумал, что эти два могут быть наиболее подходящими кандидатами для такой простой задачи. –

ответ

1

похоже, что вы пытаетесь заменить:.

</tomcat-users> 

с:

<role rolename="admin"/> 
    <role rolename="analyst"/> 
    <user username="bpmAdmin" password="password1!" roles="admin,analyst"/> 
</tomcat-users> 

СЕПГ команду, чтобы заменить образец и печать всех строк является:

sed s/pattern/replacement/ 

Экранирование символов в СЭД может быть сложно иногда.

трубы в SED (одинарные кавычки):

cat tomcat-users.xml | sed 's/<\/tomcat-users>/\n<role rolename="admin"\/>\n <role rolename="analyst"\/>\n <user username="bpmAdmin" password="password1!" roles="admin,analyst"\/>\n<\/tomcat-users>/' 

использует SED напрямую (одиночные кавычки):

sed -e 's/<\/tomcat-users>/\n<role rolename="admin"\/>\n <role rolename="analyst"\/>\n <user username="bpmAdmin" password="password1!" roles="admin,analyst"\/>\n<\/tomcat-users>/' tomcat-users.xml 
+0

Большое спасибо Тревор! Необходимы небольшие изменения, поэтому это можно было бы параметризовать с помощью переменной - я использовал двойные кавычки вместо одиночных, вокруг всей команды sed, и переменная правильно решена. Вначале я хотел, чтобы пользователь мог изменить значение этой переменной, но, видя, насколько сложным является синтаксис, я не уверен, что это хорошая идея. –

0

У меня было аналогичное требование прежде, в конечном итоге, используя слегка другой подход с использованием команды sed «c» для замены диапазона строк. Я решил переписать весь раздел, чтобы сделать скрипт идемпотент. Я добавил также некоторые проверки, чтобы убедиться, что я не заменяю прокомментированные строки. -i выполняет замену на месте.

sed -i '/^[ \t]*<tomcat-users>/,/^[ \t]*<\/tomcat-users>/c\<tomcat-users>\n<role rolename="admin"\/>\n<role rolename="analyst"\/>\n<user username="bpmAdmin" password="password1!" roles="admin,analyst"\/>\n<\/tomcat-users>' tomcat-users.xml