2017-06-07 2 views
0

jetzt habe ich Skript, um Wörter zu suchen und zu ersetzen. Wie kann ich das gleiche für Sätze oder Wortkombinationen tun? auf meinem Skript suchen:Suchen und Ersetzen mehrerer Sätze mit bash

first_words="wwe wwf ziggler" 
second_words="tna njpw okada" 

mywords=($first_words) 
mywords2=($second_words) 

if [ ${#mywords[@]} != ${#mywords2[@]} ];then 
     echo "you should use the same count of words" 
     exit 1 
else 
     echo "you are using the same count of words, continue ..." 
fi 

for ((i=0;i<"${#mywords[@]}";++i)); do 
     sed -i "s/${mywords[$i]}/${mywords2[$i]}/g" text.txt 
done 

Es funktioniert, aber nur Wort für Wort ersetzen. Aber wenn ich mehrere Wortkombinationen bei mehreren Wortkombinationen ersetzen möchte. Zum Beispiel "dolph ziggler, john cena, randy orton" möchte ich auf "cm punk, hulk hogan, rey mysterio" ersetzen. Was ich in dieser Situation tun sollte. Vielleicht sollte ich mit einem Trennzeichen umgehen. Im ersten Fall war das Leerzeichen ein Begrenzer für Wörter, aber in dieser Situation kann ich keinen Platz verwenden. Was ich tun kann ? Bitte helfen Sie.

+1

Warum zuweisen Sie Variablen und dann mit ihnen in der Anordnung zu verhindern, anstatt nur direkt dem Array zuweisen? – 123

+0

weil es nicht alles Skript ist. Es ist ein Teil des Skripts. Ich sollte Eingabeparameter in Variablen verwenden. – Piduna

+0

Wie bestimmen Sie, wo Elemente beginnen und enden? – 123

Antwort

1
mysentences=("first sentence" "second sentence") 
mysentences2=("new first" "new second") 
... 
for ((i=0;i<"${#mysentences[@]}";++i)); do 
    sed -i "s/${mysentences[$i]}/${mysentences2[$i]}/g" text.txt 
done 

Warnung, wenn Sätze / sie entwertet werden enthalten müssen und wenn sie Zeichen enthalten, die eine besondere Bedeutung in regex haben mit \Q und \E in Perl entwertet werden.

perl -i -pe 's/\Q'"${mysentences[$i]//\//\\/}"'\E/'"${mysentences2[$i]//\//\\/}/g" text.txt 

Hinweis: es ist nicht sicher, Injektion noch möglich

mysentences=("bar") 
mysentences2=('@{[`echo ok >&2`]}') 

perl -pe 's/\Q'"${mysentences[$i]//\//\\/}"'\E/'"${mysentences2[$i]//\//\\/}/g" <<<"foo bar baz" 

vorbei Sätze als Argumente Injektion

perl -pe 'BEGIN{$oldtext=shift;$newtext=shift}s/\Q$oldtext\E/$newtext/g' "${mysentences[$i]//\//\\/}" "${mysentences2[$i]//\//\\/}" <<<"foo bar baz" 
+1

Sie kann als env vars vor dem Aufruf von perl übergeben werden, um die Injektion zu verhindern, 'var1 =" $ {mysentences [$ i] // \ // \\ /} "var2 =" $ {mysentences2 [$ i] // \ // \ /} "perl -pe 's/\ Q $ ENV {" var1 "} \ E/$ ENV {" var2 "}/g' <<<" foo bar baz "' – 123

+0

@ 123 ja, kann auch als übergeben werden Die ersten beiden Argumente –

+0

Sie sind keine Argumente, sie sind env-Variablen, die für den Prozess festgelegt sind, nach dem sie ausgeführt werden. – 123