In meiner speziellen Situation muss ich mehrere hundert Dateien durchlaufen, die eine Variable enthalten, die eine URL speichert. Alle URLs sind unterschiedlich, aber aus Gründen der diesem Beispiel mit ‚com"‘So verwenden Sie sed, um ein Muster in einer Datei nur in Zeilen zu ersetzen, die ein anderes Muster enthalten
Ich muss hinzufügen, einen Text unmittelbar nach dem com
alle URLs sie alle Ende nehmen Da haben wir verschiedene Domains kann ich nicht einen sed-Befehl wie verwenden:
sed -i 's/^ENVIRONMENT="someurl.com"/ENVIRONMENT="someurl.com.origin.net"/g'
Da die Dateien anderen Linien enthalten, die com enthalten kann, kann ich nicht so etwas wie verwenden:
sed -i 's/com/com.origin.net/g'
Ich brauche diese Suche zu tun und nur in einer bestimmten Zeile enthält ein Muster, wie von meinem Beispiel unten in regex ersetzen:
^ENVIRONMENT.*
Wenn ich die Verwendung von sed nur auf die Linie konzentrieren könnte, die dem obigen Muster entspricht, könnte ich eine Anpassung von sed wie sed verwenden -i 's/com/com.origin.net/g'
. Ich könnte natürlich ein übermäßig kompliziertes Bash-Skript dazu schreiben, aber ich weiß, dass es eine gute Möglichkeit gibt, sed ein Muster zu geben, nur an der Linie zu arbeiten, in der sich das Muster befindet, und ein anderes Muster zu suchen und zu ersetzen mit einer neuen Zeichenfolge.
Bei der Suche Google, die nur halb entsprechenden Link ich darüber gefunden war:
https://unix.stackexchange.com/questions/37518/how-to-sed-only-that-lines-that-contains-given-string
aber meine Frage nicht ausreichend antwortete. Auch in der Lage zu sein, sed im Allgemeinen auf nur eine Linie zu beschränken, die einem Muster entspricht, würde durch ein nettes Werkzeug zu mir sed Arsenal hinzufügen.
Jede Hilfe, die hier zur Lösung führt, wird sehr geschätzt. Hier
ist ein Beispiel für eine Datei
### Example File
#
#
# someurl.com
ENVIRONMENT="someurl.com"
Ich möchte ersetzen ‚ENVIRONMENT =" someurl .com "‘ mit 'ENVIRONMENT = "someurl.com.orign.net"'
würde ich wahrscheinlich den sed Befehl von diesem Posten in einer Zeile Shell-Skript abgeleiteten einfügen wie:
`für f in * .config; do File2BeEdited = $ (cat $ f | grep^MusterToIdentifyLine | grep -v RemoveLinesThatAreAlreadyKorrektur); if ["$ File2BeEdited"! = ""]; dann RunSedCommand; printf "\ nEine Datei gefunden, die bearbeitet werden muss.\ NRunning sed auf $ f >> log.log "; getan
So konnte ich Schleife durch jede Konfigurationsdatei in einem Verzeichnis und selektiv diese Änderung
Dank das ist genau das, was ich erreichen wollte. Insbesondere den passenden Text einfügen zu können. Nur um mein Verständnis des abgeglichenen Textersatzes der von Ihnen zur Verfügung gestellten Antwort zu verdeutlichen; was könnte ich mit dem \ 0 erreichen? Wenn ich zum Beispiel a \ 2 verwende, würde diese Einfügung einen zweiten passenden Text von regex sagen. Zum Beispiel, wenn ich nach einer Linie mit 2 Mustern gesucht habe, um darauf zu passen. – Matthew
Schauen Sie in das GNU sed-Handbuch: [Rückverweise in regulären Ausdrücken] (http://www.gnu.org/software/sed/manual/sed.html#index-Backreferences_002c-in-regular-expressions-103) – nosid
Sie benutzen, was 'sed' Adressen nennt? – Geremia