如何使用sed或awk在文本中追加字符串

时间:2015-05-24 17:24:47

标签: bash awk sed

我想将一个指定的字符串附加到一个文件中,虽然这听起来像一个简单的任务 - 当然,我正在努力使这个工作。这是我的剧本:

    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

第一个sed命令没有解析bash变量,所以它只输出$ BUSINESS_CENTRAL_USERS

第二个sed命令以: sed:-e表达式#1,char 45:未终止的's'命令

第三个awk命令以: awk:cmd。 line:1:rolename =“admin”/&gt; awk:cmd。 line:1:^语法错误

我相信这与事实有关,我想写入文件的字符串包含“和。我还没弄清楚如何正确地逃避它...

任何建议欢迎。

这是原始输入http://pastebin.com/ZbTWmn7m 这应该是预期的输出http://pastebin.com/Gxtptuq3

2 个答案:

答案 0 :(得分:1)

看起来你正试图取代:

</tomcat-users>

使用:

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

替换模式并打印所有行的sed命令是:

sed s/pattern/replacement/  

在sed中转义字符有时会很棘手。

管道进入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

答案 1 :(得分:0)

之前我有类似的要求,最后使用sed“c”命令稍微不同的方法来替换一系列行。我决定重写整个部分,使脚本具有幂等性。我还添加了一些验证,以确保我没有替换注释行。 -i执行就地替换。

S SR 60 HW