Bash Shell脚本查找和替换
我试图搜索一个xml文件并替换某个字符,以便使用shell脚本将所有1.5.1-SNAPSHOT替换为5.0.0Bash 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&
<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>
您的脚本似乎有很多问题
fi
,之前没有任何匹配的if
1\.5\.1-SNAPSHOT
,替换为一个简单的5.0.0
${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>