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)
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...我认为这不是唯一的要求:-)