Shell脚本查找和替换

时间:2015-03-05 20:07:51

标签: bash shell sed

我正在尝试搜索xml文件并替换某个字符,以便使用shell脚本将所有1.5.1-SNAPSHOT替换为5.0.0

<modelVersion>4.0.0</modelVersion>
   <groupId>com.verio.oss.common</groupId>
   <artifactId>oss-common-parent</artifactId>
   <name>oss-common-parent</name>
   <version>1.5.1-SNAPSHOT</version>
   <description>MarketPlace SuperPOM</description>
<modules>
   <ui-server-svcs-version>1.5.1-SNAPSHOT</ui-server-svcs-version>
   <ui-client-svcs-version>1.5.1-SNAPSHOT</ui-client-svcs-version>
   <ui-widgets-version>1.5.1-SNAPSHOT</ui-widgets-version>
   <ossb-billing-version>1.5.1-SNAPSHOT</ossb-billing-version>
   <ossb-integration-version>1.5.1-SNAPSHOT</ossb-integration-version>
   <oss-ems-config-version>1.5.1-SNAPSHOT</oss-ems-conf>
<properties>
   <skipTests>true</skipTests>
   <app-version>${project.parent.version}</app-version>
   <app-build-date>09/27/2011</app-build-date>
   <app-build-number>1</app-build-number>
   <app-build-revision>101</app-build-rev>

我尝试过这个脚本,但它没有用,任何帮助都会有所帮助

#!/bin/bash
search="(1\.5.\1-\SNAPSHOT\)"
rep="(\5.\0.\0)"
sed -i.bak 's/${search}/${rep}/g' nameoffile.xml
fi

2 个答案:

答案 0 :(得分:3)

您的脚本似乎存在许多问题。

  1. 第6行包含fi之前没有任何匹配的if

  2. 您要搜索的正则表达式应该是1\.5\.1-SNAPSHOT,而替换为简单的5.0.0

  3. 在您对sed '"的调用中使用${search}代替${rep}将不会进行插值。请尝试使用"。正如评论部分所指出的,在这种情况下不要忘记qoute shell元字符。

  4. sed s/1\\.5\\.1-SNAPSHOT/5.0.0/g应该是您完成工作所需的整个脚本。

    请注意,双\可以在shell的正则表达式中转义所需的\

答案 1 :(得分:0)

$ cat tst.sh
search="1\.5\.1-SNAPSHOT"
rep="5.0.0"
sed "s/${search}/${rep}/g" file

$ ./tst.sh  
<modelVersion>4.0.0</modelVersion>
   <groupId>com.verio.oss.common</groupId>
   <artifactId>oss-common-parent</artifactId>
   <name>oss-common-parent</name>
   <version>5.0.0</version>
   <description>MarketPlace SuperPOM</description>
<modules>
   <ui-server-svcs-version>5.0.0</ui-server-svcs-version>
   <ui-client-svcs-version>5.0.0</ui-client-svcs-version>
   <ui-widgets-version>5.0.0</ui-widgets-version>
   <ossb-billing-version>5.0.0</ossb-billing-version>
   <ossb-integration-version>5.0.0</ossb-integration-version>
   <oss-ems-config-version>5.0.0</oss-ems-conf>
<properties>
   <skipTests>true</skipTests>
   <app-version>${project.parent.version}</app-version>
   <app-build-date>09/27/2011</app-build-date>
   <app-build-number>1</app-build-number>
   <app-build-revision>101</app-build-rev>

当您对它感到满意时,请添加-i arg。

请注意,这会在3411.5.1-SNAPSHOTISH或类似的中间部分错误地匹配 - 如果这是一个问题,请为正则表达式添加边界,例如:search=">1\.5\.1-SNAPSHOT<"并在替换中考虑它们

相关问题