用另一个文件的内容替换文件中的分隔文本块

Ric*_*mon 6 bash shell scripting awk sed

我需要编写一个简单的脚本,用另一个文件的内容替换配置文件中的文本块.

让我们假设有以下简化文件:

server.xml

<?xml version='1.0' encoding='UTF-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="80" protocol="HTTP/1.1"/>
    <Engine name="Catalina" defaultHost="localhost">
      <!-- BEGIN realm -->
        <sometags/>
        <sometags/>
      <!-- END realm -->
      <Host name="localhost" appBase="webapps"/>
    </Engine>
  </Service>
</Server>
Run Code Online (Sandbox Code Playgroud)

realm.xml

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
       resourceName="UserDatabase"/>
Run Code Online (Sandbox Code Playgroud)

我想运行一个脚本并realm.xml替换<!-- BEGIN realm --><!-- END realm -->行之间的内容.如果realm.xml更改,则每当脚本再次运行时,它将使用新内容再次替换行realm.xml.这是为了/etc/init.d/tomcat在多个安装的服务启动时运行,在这些安装上领域将是不同的.

我不太确定我怎么能用awk或简单地做到这一点sed.

Pau*_*ce. 14

尝试一下:

sed -i -ne '/<!-- BEGIN realm -->/ {p; r realm.xml' -e ':a; n; /<!-- END realm -->/ {p; b}; ba}; p' server.xml
Run Code Online (Sandbox Code Playgroud)

  • `ba`分支在与"BEGIN"测试相关联的大括号内标记"a",并且当发现"END"时,"b"分支到结尾,因为它位于与该测试相关联的一组大括号中.它有点像`if/BEGIN /然后读取文件; 而不是/ END /做跳过线`. (3认同)

Pét*_*rök 5

TOTAL_LINES=`cat server.xml | wc -l`
BEGIN_LINE=`grep -n -e '<!-- BEGIN realm -->' server.xml | cut -d : -f 1`
END_LINE=`grep -n -e '<!-- END realm -->' server.xml | cut -d : -f 1`
TAIL_LINES=$(($TOTAL_LINES-$END_LINE))

head -n $BEGIN_LINE server.xml > server2.xml
cat realm.xml > server2.xml
tail -n $TAIL_LINES server.xml > server2.xml
Run Code Online (Sandbox Code Playgroud)

(好吧,这不使用 awk 或 sed...我认为这不是唯一的要求:-)