2017-05-16 2 views
0

Ich versuche, einige Bash-Code von unnötigen Wiederholungen zu bereinigen. Derzeit sieht es so aus (Beispiel Wert):Wie kann man eine Sequenz von mehreren sed-Ersetzungen optimieren?

pattern1='aaa' 
pattern2='bbb' 
pattern3='ccc' 

replacement1='XX' 
replacement2='YY' 
replacement3='ZZ' 

tail $LOGS | 
sed -e "s/${pattern1}/${replacement1}/g" \ 
    -e "s/${pattern2}/${replacement2}/g" \ 
    -e "s/${pattern3}/${replacement3}/g" 

Ich habe darüber nachgedacht, die Muster und Ersetzungen in 2 Reihen zu setzen:

pattern[0]='aaa' 
pattern[1]='bbb' 
pattern[2]='ccc' 
# ... 
replacement[0]='XX' 
replacement[1]='YY' 
replacement[2]='ZZ' 
# ... 

aber ich weiß nicht, wie das Endergebnis fusionieren so dass ich den endgültige Befehl wie folgt erhalten und ausführen:

tail $LOGS | sed -e "s/aaa/XX/g" -e "s/bbb/YY/g" -e "s/ccc/ZZ/g" 

die Idee zu können, ist mehr von Mustern und Ersatz später in einer sauberen und gut lesbaren Art und Weise hinzuzufügen, ohne die actua zu modifizieren Ich befehle, dass sie ausgeführt werden.

Was ist der beste Weg, dies zu tun?

+1

Sie betrachten könnte zu einer fähigeren Sprache wechseln, wie Perl oder Python. – Kenster

+0

@Kenster - sobald ich einen von ihnen lerne :) – george

Antwort

2

eine Reihe von Argumenten in einer Schleife erstellen:

#!/bin/bash 
patterns=('a' 
      'bcd' 
      'x.*z' 
) 

replacements=('A' 
       'BCD' 
       'Y' 
) 

args=() 
for ((i=0; i < ${#patterns[@]}; i++)) ; do 
    args+=(-e "s/${patterns[i]}/${replacements[i]}/g") 
done 

echo 'a bcd xyyyz' | sed "${args[@]}" 

BTW: Ich habe einmal das Skript in Perl umschreiben würde ich dazu bekam.

Wenn Sie nicht wollen, die Muster und Ersatz zu trennen, für beide ein Array verwenden und den Schritt zu erhöhen:

#!/bin/bash 
subst=('a' 'A' 
     'bcd' 'BCD' 
     'x.*z' 'Y' 
) 

args=() 
for ((i=0; i < ${#subst[@]}; i+=2)) ; do 
    args+=(-e "s/${subst[i]}/${subst[i+1]}/g") 
done 

echo 'a bcd xyyyz' | sed "${args[@]}" 
+0

Das funktioniert. Vielen Dank! – george

+0

Frage: Ich habe es versucht (https://pastebin.com/XgetVqJB), aber es gibt 'asdfmm1mmm2mmm3mmm4m 'aus (alle alphabetischen Zeichen sind rot, die Ziffern sind nicht hervorgehoben). Was könnte der Grund sein? Gibt es auch einen einfacheren Weg, Elemente an die "Muster" und "Ersetzungen" anzuhängen? In Ihrem Code sind sie getrennt und wenn es 50 Ersatz gibt, wäre es sehr schwierig zu folgen, mit welchen Paaren. – george

+1

@george: Antworten auf die zweite Frage im Update. Überprüfen Sie immer noch den 1.. – choroba

Verwandte Themen