Frage Suchen und Ersetzen von Text in einer Datei mithilfe von Befehlen


Wie kann ich bestimmte Wörter in einer Textdatei mithilfe der Befehlszeile finden und ersetzen?


434
2018-01-07 04:10


Ursprung


Mai von deinem Interesse github.com/lucio-martinez/rch :-) - Lucio


Antworten:


sed -i 's/original/new/g' file.txt

Erläuterung:

  • sed = EDitor streamen
  • -i = an Ort und Stelle (d. h. zurück in die ursprüngliche Datei speichern)
  • Die Befehlszeichenfolge:

    • s = der Ersatzbefehl
    • original = ein regulärer Ausdruck, der das zu ersetzende Wort (oder nur das Wort selbst) beschreibt
    • new = der Text, mit dem er ersetzt werden soll
    • g = global (d. h. alle ersetzen und nicht nur das erste Vorkommen)
  • file.txt = der Dateiname


724
2018-01-07 04:23



@mcExchange Wenn es speziell das ist / Zeichen, das Sie übereinstimmen müssen, können Sie einfach ein anderes Zeichen als Trennzeichen verwenden (z. 's_old/text_new/text_g'). Andernfalls können Sie ein \  vor irgendwelchen von $ * . [ \ ^ um den wörtlichen Charakter zu bekommen. - cscarney
@BrianZ Für das Dateisystem ist die Ausgabe von sed eine neue Datei mit dem gleichen Namen. Es ist einer der häufig gemeldete Fehler, die keine Fehler sind - cscarney
Du möchtest vielleicht s/\boriginal\b/new/g Anstatt von s/original/new/g (\b passt an einer Wortgrenze), um nur ganze Wörter zu ersetzen. - Chris Martin
Der OSX-Befehl sed -i '.bak' 's/original/new/g' file.txt kann auch mit einer Verlängerung der Länge Null ausgeführt werden sed -i '' 's/original/new/g' file.txt, die keine Sicherung generieren wird. - Kirk
MacOS-Benutzer müssen '' 'nach -i als Parameter für -i hinzufügen ed.gs/2016/01/26/os-x-sed-invalid-command-code damit die Datei überschrieben wird. - geoyws


Hierfür gibt es verschiedene Möglichkeiten. Man benutzt sed und Regex. SED ist ein Stream-Editor zum Filtern und Umwandeln von Text. Ein Beispiel ist wie folgt:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

Eine andere Möglichkeit, die sinnvoller ist als < strin und > strout ist mit Pfeifen!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog

26
2018-01-07 04:26



beachten Sie das cat im cat file | sed '...' ist unnötig. Sie können direkt sagen sed '...' file. - fedorqui
In der Tat kann dies weiter reduziert werden: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly wird Datei yarly nehmen und die 2 Änderungen an Ort und Stelle tun, während ein Backup macht. Verwenden time bash -c "$COMMAND" zur zeit schlägt es vor, dass diese version ~ 5 mal schneller ist. - pbhj


Sie können Vim im Ex-Modus verwenden:

ex -sc '%s/OLD/NEW/g|x' file
  1. % Wähle alle Zeilen aus

  2. s Ersatz

  3. g Ersetze alle Instanzen in jeder Zeile

  4. x Schreiben Sie, wenn Änderungen vorgenommen wurden (sie haben) und beenden


15
2018-04-16 18:36





Durch awks gsub Befehl,

awk '{gsub(/pattern/,"replacement")}' file

Beispiel:

awk '{gsub(/1/,"0");}' file

Im obigen Beispiel werden alle 1 durch 0 ersetzt, unabhängig von der Spalte, in der sie sich befindet.


Wenn du einen Ersatz für eine bestimmte Spalte erstellen willst, dann tu das

awk '{gsub(/pattern/,"replacement",column_number)}' file

Beispiel:

awk '{gsub(/1/,"0",$1);}' file

Es ersetzt 1 nur durch 0 in der Spalte 1.

Durch Perl,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar

14
2017-07-02 12:59



Ich habe dies am MacOS-Terminal benutzt und es hat nichts gemacht ... - Jim


Es gibt eine Vielzahl von Möglichkeiten, dies zu erreichen. Abhängig von der Komplexität dessen, was man mit der String-Ersetzung zu erreichen versucht, und abhängig von Tools, mit denen der Benutzer vertraut ist, können einige Methoden mehr bevorzugt werden als andere.

In dieser Antwort verwende ich einfach input.txt Datei, mit der Sie alle hier bereitgestellten Beispiele testen können. Der Inhalt der Datei:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

BASH

Bash ist nicht wirklich für die Textverarbeitung gedacht, aber einfache Substitutionen können über Parametererweiterung Insbesondere können wir hier eine einfache Struktur verwenden ${parameter/old_string/new_string}.

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

Dieses kleine Skript ersetzt nicht direkt, dh Sie müssten neuen Text in einer neuen Datei speichern und die alte Datei löschen mv new.txt old.txt

Randnotiz: Wenn Sie neugierig sind, warum while IFS= read -r ; do ... done < input.txt verwendet wird, ist es im Grunde Shell Art von Datei Zeile für Zeile zu lesen. Sehen Dies als Referenz.

AWK

AWK, ein Textverarbeitungsprogramm, ist für eine solche Aufgabe ziemlich geeignet. Es kann einfache Ersetzungen und sehr viel mehr auf Basis von Reguläre Ausdrücke. Es bietet zwei Funktionen: sub() und gsub(). Die erste ersetzt nur das erste Vorkommen, während die zweite Vorkommnisse in der ganzen Zeichenfolge ersetzt. Zum Beispiel, wenn wir eine Zeichenfolge haben one potato two potato , das wäre das Ergebnis:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 

AWK kann eine Eingabedatei als Argument verwenden und damit die gleichen Dinge tun input.txt , wäre einfach:

awk '{sub(/blue/,"azure")}1' input.txt

Abhängig von der Version von AWK, die Sie haben, kann es eine direkte Bearbeitung haben, daher ist es üblich, neuen Text zu speichern und zu ersetzen. Zum Beispiel so etwas:

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

SED

Sed ist ein Linieneditor. Es verwendet auch reguläre Ausdrücke, aber für einfache Ersetzungen reicht es aus:

sed 's/blue/azure/' input.txt

Was ist gut an diesem Tool ist, dass es In-Place-Bearbeitung, die Sie mit aktivieren können -i Flagge.

Perl

Perl ist ein weiteres Tool, das oft für Textverarbeitung verwendet wird, aber es ist eine allgemeine Sprache und wird in Netzwerk-, System-Verwaltung, Desktop-Anwendungen und vielen anderen Orten verwendet. Es hat viele Konzepte / Features aus anderen Sprachen wie C, sed, awk und anderen übernommen. Einfache Substitution kann so gemacht werden:

perl -pe 's/blue/azure/' input.txt

Wie sed hat Perl auch die -i Flagge.

Python

Diese Sprache ist sehr vielseitig und wird auch in einer Vielzahl von Anwendungen verwendet. Es hat viele Funktionen für die Arbeit mit Strings, unter anderem replace()Also wenn du Variable wie hast var="Hello World" , du könntest es tun var.replace("Hello","Good Morning")

Eine einfache Möglichkeit, die Datei zu lesen und die Zeichenfolge darin zu ersetzen, wäre wie folgt:

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

Mit Python müssen Sie jedoch auch eine neue Datei ausgeben, die Sie auch innerhalb des Skripts selbst ausführen können. Zum Beispiel, hier ist ein einfacher:

#!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])

Dieses Skript soll mit aufgerufen werden input.txt als Befehlszeilenargument.

Python kann auch reguläre Ausdrücke haben, insbesondere gibt es re Modul, das hat re.sub() Funktion, die für fortgeschrittenere Ersetzungen verwendet werden kann.


12
2018-02-03 07:49





sed ist der sTream edItor, in dem du verwenden kannst | (Rohr) zu senden Standard-Streams (STDIN und STDOUT spezifisch) durch sed und ändern sie programmatisch im laufenden Betrieb, so dass es ein praktisches Werkzeug in der Unix-Philosophietradition ist; aber können Dateien auch direkt bearbeiten, indem Sie die -i Parameter unten erwähnt.
Folgendes berücksichtigen:

sed -i -e 's/few/asd/g' hello.txt

s/ wird benutzt um substitute den gefundenen Ausdruck few mit asd:

Die wenigen, die Mutigen.


Der Asd, der Mutige.

/g steht für "global", also für die ganze Linie. Wenn du das auslässt /g (mit s/few/asd/, es muss immer drei Schrägstriche geben, egal was) und few erscheint zweimal in derselben Zeile, nur die erste few wird geändert in asd:

Die wenigen Männer, die wenigen Frauen, die Tapferen.


Die Asd-Männer, die wenigen Frauen, die Mutigen.

Dies ist unter bestimmten Umständen nützlich, z. B. das Ändern von Sonderzeichen am Anfang von Zeilen (zum Beispiel Ersetzen der größeren Symbole durch einige Personen, um vorheriges Material in E-Mail-Threads mit einem horizontalen Tabulator zu zitieren, während später eine zitierte algebraische Ungleichung in der Zeile verbleibt unberührt), aber in Ihrem Beispiel, wo Sie das angeben irgendwo  few tritt auf, sollte es ersetzt werden, stellen Sie sicher, dass Sie das haben /g.

Die folgenden zwei Optionen (Flags) werden zu einem zusammengefasst: -ie:

-i Option wird zum Bearbeiten verwendet ichn Ort in der Datei hello.txt.

-e Option zeigt die eXpression / Befehl in diesem Fall ausgeführt werden s/.

Hinweis: Es ist wichtig, dass Sie verwenden -i -e suchen / ersetzen. Wenn Sie tun -ieErstellen Sie eine Sicherungskopie jeder Datei mit dem angehängten Buchstaben "e".


6
2017-11-23 09:00





Du kannst das so machen:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 

Beispiele: Um alle Vorkommen [logdir ',' '] (ohne []) mit [logdir', os.getcwd ()] in allen Dateien zu ersetzen, die das Ergebnis des locate-Befehls sind, tun Sie Folgendes:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

wo [tensorboard / program.py] die zu durchsuchende Datei ist


0
2017-07-24 02:13



Hallo. Ihre Auswahl an Saiten (logdir', '' -> /logdir', os.getcwd()) macht diese Antwort schwer zu analysieren. Es sollte auch angegeben werden, dass Ihre Antwort zuerst die zu verwendenden Dateien sed auflistet, da dies nicht Teil der Frage ist. - mwfearnley
Hi, diese Antwort ist sowohl Suche als auch Ersetzung, wenn sie <alter Text> in der Datei gefunden hat. - Nguyễn Tuấn Anh
Ich wähle diese Antwort für alle, die Tensorboard in Keras verwenden, die den Befehl ändern möchten von: tensorboard --logdir = '/ Pfad / zu / log / Ordner /' zu verwenden: Tensorboard nur, wenn im Ordner Protokolle bleiben. es ist sehr bequem - Nguyễn Tuấn Anh