2017-05-15 2 views
0

Gibt es eine einfachere Möglichkeit, das Folgende zu tun? Vielleicht ein einzelner Befehl, der den Text ersetzt, wenn er existiert, wenn er keinen Text an die Datei anhängt. Ich muss dies für verschiedene Dateien tun und möchte einen Weg finden, um in eine Funktion einzusteigen. Die Zeilenformatierung wird leicht variieren zwischen, ich setze 2 Beispiel unten.Wie erstelle ich eine Bash-Funktion, um die Zeile zu ersetzen oder an die Datei anzufügen

#If grep exists then sed line, else echo to end of file 
grep -q '^sometext' /file1.txt && sed -i "" "s/^sometext.*/sometext $newvar/" /file1.txt || echo "sometext $newvar" >> /file1.txt 
grep -q '^someothertext' /file2.txt && sed -i "" "s/^someothertext.*/someothertext=$othernewvar/" /file1.txt || echo "someothertext=$othernewvar" >> /file1.txt 
+0

Wäre es jemals möglich, * mehr * als einen Ersatz zu machen? Ich denke, es sollte in 'sed' möglich sein, ein Skript zu schreiben, das sowohl den Ersetzungscode * als auch den Append-Code enthält, aber der Append-Code wird nur erreicht, wenn kein Austausch stattfindet. – chepner

Antwort

1

Jedes Mal, wenn Sie sich grep + sed oder mehr seds oder verschiedene andere Kombinationen von Werkzeugen nur Text zu manipulieren, indem finden, ist es Zeit, einfach zu prüfen, awk statt mit:

awk -v key="sometext" -v sep=" " -v new="$newvar" ' 
sub("^"key".*",key sep new) { f=1 } 
{ print } 
END { if (!f) print key sep new } 
' file 

awk -v key="someothertext" -v sep="=" -v new="$othernewvar" ' 
sub("^"key".*",key sep new) { f=1 } 
{ print } 
END { if (!f) print key sep new } 
' file 

Beachten Sie, dass die obige Verwendung Regexps und Backreference-fähige Ersetzungszeichenfolgen wie sed tun, so müssen Sie sich im Schlüssel und im neuen Text über auslaufende Metazeichen (., , +, & usw. - siehe https://stackoverflow.com/a/29626460/1745001) Gedanken machen. Da Sie awk verwenden, obwohl, können Sie Zeichenketten verwenden Sie stattdessen:

awk -v key="sometext" -v sep=" " -v new="$newvar" ' 
index(key)==1 { $0 = key sep new; f=1 } 
{ print } 
END { if (!f) print key sep new } 
' file 

und dann müssen Sie sich keine Sorgen zu machen. Das einzige Zeichen, über das Sie noch nachdenken müssen, ist Backslash, weil \t in ein Tab-Zeichen umgewandelt wird, wenn Sie eine Variablenzuweisung mit -v vornehmen, aber es gibt eine einfache Optimierung, wenn es ein Problem ist.

+1

musste 'key' aus der Ausgabe entfernen, aber anders als das ist das, was ich brauchte, danke! – bc81

Verwandte Themen