2013-04-15 13 views
5

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

Antwort

9

Die folgende Befehlszeile zeigt zwei mögliche Lösungen machen: Sie den Austausch bestimmter Linien mit /regex/ beschränken können. Und Sie den gefundenen Text in Ersatz mit \0 verwenden können, \1 usw.

sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/' 
+0

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

+1

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

+0

Sie benutzen, was 'sed' Adressen nennt? – Geremia

-2

Sie können es mit gvim tun ..

: g/^ Baz/s/foo/bar/g

Erklärung: in allen Linien mit Baz beginnend, alle Vorkommen von foo mit Leiste ersetzen.

Check http://vim.wikia.com/wiki/Search_and_replace für mehr Details ..

+2

Das OP bat um eine Lösung in 'sed'; Das ist nicht sed. –

Verwandte Themen