2015-03-05 2 views
1

я пытаюсь найти файл XML и заменить определенный характер, так что я все 1.5.1-SNAPSHOT заменяются 5.0.0, используя сценарий оболочкиShell скрипт найти и заменить

<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 

ответ

3

В вашем скрипте, похоже, есть ряд проблем.

  1. линия 6 содержит fi без какого-либо согласования if перед тем

  2. Регулярное выражение, которое вы ищете, скорее, должны быть 1\.5\.1-SNAPSHOT и замена простой 5.0.0

  3. Использование ' вместо " в вашем вызов sed ${search} и ${rep} не будет интерполирован. Вместо этого попробуйте использовать ". Как указано в разделе комментариев, не забывайте о метасимволах оболочки Qoute в этом случае.

sed s/1\\.5\\.1-SNAPSHOT/5.0.0/g должен быть весь сценарий, необходимый для выполнения этой работы.

Обратите внимание на двойной \, чтобы избежать одного \, который вы хотите в своем регулярном выражении для оболочки.

+1

Кроме того, parens вокруг поискового regexp не повредят (но они тоже не помогут), но вокруг строки замены они появятся как есть. Вам также не нужно скрывать '.' В заменяющей строке. –

+0

может кто-нибудь показать мне, как будет выглядеть полный сценарий, потому что я делаю изменения, но я все еще получаю ошибку – andrefella

+0

whee! это правда. Я избавился от спасения. Спасибо за подсказку. – mikyra

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<" и учтите их взамен.

Смежные вопросы