2017-12-21 4 views
-1

Ich habe eine Konfigurationsdatei (xml) in Linux, ich versuche die student_names zusätzliche Schüler hinzufügen Configuration_item (wenn sie nicht dort)
Zum Beispiel, wenn ich bekommen Donald ich brauche nichts zu tun, weil seine dort
Wenn ich Tom bekommen ich es hinzufügen müssen, weil seine nicht daanhänge Text Abschnitt in einer XML-Datei mit Shell-Skript

<Configuration_item Key="foo" Value="bar"/> 
<Configuration_item Key="students_names" Value="Todd;Marry;Alen;Donald"/> 
<Configuration_item Key="foo2" Value="baz/> 
+2

einen XML-Parser verwenden – anubhava

+0

Das zuviel des Guten für dieses – user648026

Antwort

3

es wäre besser, zu gehen mit einem XML Parser jedoch bash kann dies tun, falls th e xml Datei ist einfach. Keine schöne Lösung, aber es kann den Trick leisten.

#!/bin/bash 

infile="$1" 
name="$2" 

while IFS='' read -r line || [[ -n "$line" ]]; do 
    case $line in 
    *students_names*) 
         case $line in 
         *"$name"\;*|*"$name"\"*) echo "$line" ;; 
         *) echo "${line//Value=\"/Value=\"$name;}" ;; 
         esac ;; 
    *) echo "$line" ;; 
    esac 
done < "$infile" 

Das Skript liest und analysiert die Eingabe example.xml Datei Zeile für Zeile. Es wendet eine variable Erweiterung an, um der Zielzeile zu entsprechen (die Key="students_names" enthält) und zu entscheiden, ob sie $name enthält. Wenn es keine Übereinstimmung mit $name gibt, fügen Sie es hinzu, andernfalls drucken Sie die Zeile.

Beispiel 1:

./add_value.sh example.xml Todd

Output:

<Configuration_item Key="foo" Value="bar"/> 
<Configuration_item Key="students_names" Value="Todd;Marry;Alen;Donald"/> 
<Configuration_item Key="foo2" Value="baz/> 

Beispiel 2:

./add_value.sh example.xml Toddy

Ausgang:

<Configuration_item Key="foo" Value="bar"/> 
<Configuration_item Key="students_names" Value="Toddy;Todd;Marry;Alen;Donald"/> 
<Configuration_item Key="foo2" Value="baz/> 
+0

ist danken ihnen, was dies zu tun? * "$ name" \; * | * "$ name" \ "*) ist es wie" Toddy or Toddy "? – user648026

+1

Es prüft, ob $ name in der $ -Zeile gefolgt von; (Name ist in der Mitte der Listing) oder "(Name steht am Ende der Auflistung). Das sind Toddy und Todd sind unterschiedliche Namen auf diese Art. Wenn es einen Namen gibt, der Teilzeichenfolge eines anderen Namens ist, wird separat behandelt. – marcell