Bash Shell脚本查找和替换

Bash Shell脚本查找和替换,bash,shell,sed,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&

我试图搜索一个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>

您的脚本似乎有很多问题

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

  • 您正在搜索的正则表达式应该是
    1\.5\.1-SNAPSHOT
    ,替换为一个简单的
    5.0.0

  • 在对sed
    ${search}
    ${rep}
    的调用中使用
    '
    而不是
    将不会被插值。请尝试改用
    。正如注释部分所指出的,在本例中不要忘记使用shell元字符

  • sed s/1\\.5\\.1-SNAPSHOT/5.0.0/g
    应该是完成此项工作所需的全部脚本

    请注意双精度
    \
    以转义您希望在shell的regexp中使用的
    \

    $cat tst.sh
    
    $ 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>
    
    search=“1\.5\.1-快照” rep=“5.0.0” sed“s/${search}/${rep}/g”文件 $./tst.sh 4.0.0 com.verio.oss.common oss公共父级 oss公共父级 5.0.0 超级市场 5.0.0 5.0.0 5.0.0 5.0.0 5.0.0 5.0.0 真的 ${project.parent.version} 09/27/2011 1. 101
    当您满意时,将
    -i
    参数添加回原处


    请注意,这将错误地匹配
    3411.5.1-SNAPSHOTISH
    或类似内容的中间部分-如果这是一个问题,请向regexp添加边界,例如:
    search=“>1\.5\.1-Snapshot搜索regexp周围的参数也不会有任何影响(但它们也不会有帮助)但是在替换字符串周围,它们将按原样显示。您也不需要在替换字符串中转义
    s。有人能告诉我,由于我进行了更改,但仍然出现错误,所以整个脚本将是什么样子吗?Whee!这是真的。我在rep中记住了转义
    。感谢您的提示。您必须加倍转义m因为您没有引用脚本,所以请输入个字符。@EdMorton:刚刚在要求的“完整纸条”版本中添加了这个字符。再次感谢您的提示。
    $ 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>