2016-07-26 11 views
1

Ich möchte ein bestimmtes Wort zwischen den Tags ersetzen. Zum Beispiel beginnen Withe wie folgt zusammen:Ersetzen Sie den Inhalt zwischen einigen Tags mit einem bestimmten Wort usin Shell-Skript oder Unix-Befehl

<artifactID>abc</artifctID> 
<packaging>war</packaging> 
<version>1.20.0-SNAPSHOT</version> 

ich die artifactID Tag finden wollen, dann 1.20.0-SNAPSHOT mit 1.22.0-SNAPSHOT ersetzen. Beachten Sie, dass es die artifactID finden und die Versionsnummer ersetzen muss, die in der 2. oder 3. Zeile nach artifactID stehen kann.

Ich muss dies mit einem Unix-Befehl oder einem Shell-Skript tun. Danke im Voraus.

+0

Gibt es mehrere '' Zeilen in Ihrer Eingabedatei? – anubhava

+0

ist es eine pom.xml Datei? – Kent

+0

Ja, es gibt mehrere Versionen in der Datei und es ist pom.xml – nikhilrn09

Antwort

0

Unten ist das Skript, das ich zurückgegeben habe, das dein Problem beheben sollte. Ich habe sed Befehl verwendet, um die Versionsnummer zu ersetzen. Ich habe Return-Kommentar zur Erklärung der Logik

# You can set below two variables based on input argument using "$1" and "$2" 
artifact_name="abc" 
your_version="your_version" 
_count=0 
_line=0 
while read -r line 
do 
_line=$((_line+1)) 
#Search for specific atrifact id 
isArtifact=$(echo "$line" | grep ">${artifact_name}<") 
# If artifact id found, increment count by 1 
if [ "$isArtifact" != "" ] 
then 
    _count=1 
fi 

if [ "$_count" -eq 1 ] 
then 

    # As we have found the artifact id, now we will search for the version 
    isVersionLine=$(echo "$line" | grep -i '<version>') 
    echo "$isVersionLine" 
    if [ "$isVersionLine" != "" ] 
    then 
     # Once version is found, replace it with specific version 
     sed -i pom.xml -e "${_line}s/<version>.*<\/version>/<version>${your_version}<\/version>/" 
     # Increment count to 2 so that no new version is changed. Instead only break will also do 
     _count=$((_count+1)) 
     break 
    fi 
fi 
done < pom.xml