Suchen und Ersetzen von Text in einer Datei mithilfe von Befehlen


Zur akzeptierten Antwort gehen


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


680





2011-01-07




Anzahl der Antworten: 7


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

Erläuterung:

  • sed = Stream-Editor
  • -i = an Ort und Stelle (dh in die ursprüngliche Datei zurückspeichern)
  • Die Befehlszeichenfolge:

    • s = der Ersatzbefehl
    • original = ein regulärer Ausdruck, der das zu ersetzende Wort beschreibt (oder nur das Wort selbst)
    • new = der zu ersetzende Text
    • g = global (dh alles ersetzen und nicht nur das erste Vorkommen)
  • file.txt = der Dateiname


1106


2011-01-07

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

 [email protected]: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
[email protected]: ~$ sed s/slow/quick/ < orly > yarly
[email protected]: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog
 

Ein anderer Weg, der sinnvoller sein kann als < strin und > strout ist mit Rohren!

 [email protected]: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
[email protected]: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog
 

34


2011-01-07

Es gibt eine Vielzahl von Möglichkeiten, dies zu erreichen. Abhängig von der Komplexität dessen, was mit dem Ersetzen von Zeichenfolgen erreicht werden soll, und abhängig von den Tools, mit denen der Benutzer vertraut ist, werden einige Methoden möglicherweise mehr bevorzugt als andere.

In dieser Antwort verwende ich eine einfache input.txt Datei, mit der Sie alle hier aufgeführten 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 eigentlich nicht für die Textverarbeitung gedacht, aber einfache Ersetzungen können durch Parametererweiterung erfolgen , 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 entfernen oder mv new.txt old.txt

Randnotiz: Wenn Sie neugierig sind, warum while IFS= read -r ; do ... done < input.txt es verwendet wird, lesen Sie die Datei im Prinzip Zeile für Zeile. Siehe dies als Referenz.

AWK

AWK, ein Textverarbeitungsprogramm, ist für eine solche Aufgabe durchaus geeignet. Es kann einfache und fortgeschrittene Ersetzungen auf der Basis regulärer Ausdrücke durchführen . Es bietet zwei Funktionen: sub() und gsub() . Der erste ersetzt nur das erste Vorkommen, während der zweite - Vorkommen in der gesamten Zeichenfolge ersetzt. Wenn wir zum Beispiel einen String haben one potato two potato , wäre dies 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. Dasselbe input.txt gilt für:

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

Abhängig von der Version von AWK, die Sie haben, kann es sein, dass die Bearbeitung an Ort und Stelle erfolgt oder nicht. Daher besteht die übliche Praxis darin, 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 Zeileneditor. Es werden auch reguläre Ausdrücke verwendet, aber für einfache Ersetzungen ist es ausreichend, Folgendes zu tun:

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

Das Gute an diesem Tool ist, dass es eine direkte Bearbeitung hat, die Sie mit -i flag aktivieren können .

Perl

Perl ist ein weiteres Tool, das häufig für die Textverarbeitung verwendet wird, aber eine universelle Sprache ist und in Netzwerken, der Systemadministration, Desktop-Apps und vielen anderen Bereichen verwendet wird. Es wurden viele Konzepte / Funktionen aus anderen Sprachen wie C, sed, awk und anderen übernommen. Eine einfache Ersetzung kann folgendermaßen erfolgen:

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

Wie sed hat auch perl das Flag -i.

Python

Diese Sprache ist sehr vielseitig und wird auch in einer Vielzahl von Anwendungen verwendet. Es hat eine Menge Funktionen für die Arbeit mit Strings, unter denen Sie replace() , wenn Sie Variablen wie haben var="Hello World" , tun könnten var.replace("Hello","Good Morning")

Ein einfacher Weg, eine Datei zu lesen und einen String darin zu ersetzen, wäre folgender:

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

Mit Python müssen Sie jedoch auch in eine neue Datei ausgeben, was Sie auch innerhalb des Skripts selbst tun können. Zum Beispiel ist hier 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 ist input.txt als Kommandozeilenargument aufzurufen. Der genaue Befehl zum Ausführen eines Python-Skripts mit einem Befehlszeilenargument wäre

  $ ./myscript.py input.txt
 

oder

 $ python ./myscript.py input.txt
 

Vergewissern Sie sich natürlich, dass ./myscript.py sich das in Ihrem aktuellen Arbeitsverzeichnis befindet, und stellen Sie zunächst sicher, dass es mit ausführbar eingestellt ist chmod +x ./myscript.py

Python kann auch reguläre Ausdrücke haben, insbesondere gibt es re Module, die re.sub() Funktionen haben, die für fortgeschrittenere Ersetzungen verwendet werden können.


27


2017-02-03

Sie können Vim im Ex-Modus verwenden:

 ex -s -c '%s/OLD/NEW/g|x' file
 
  1. % Wählen Sie alle Zeilen aus

  2. s Ersatz

  3. g Ersetzen Sie alle Instanzen in jeder Zeile

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


22


2016-04-16

Durch awks gsub Befehl

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

Beispiel:

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

Im obigen Beispiel werden alle Einsen durch Nullen ersetzt, unabhängig von der Spalte, in der sie sich befinden.


Wenn Sie eine bestimmte Spalte ersetzen möchten, gehen Sie folgendermaßen vor:

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

Beispiel:

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

Ersetzt 1 nur in der ersten Spalte durch 0.

Durch Perl,

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

21


2014-07-02

sed ist die s tream ed itor , in denen Sie verwenden können | (Rohr) zu senden Standard - Streams (STDIN und STDOUT spezifisch) durch sed und verändern sie programmatisch im laufenden Betrieb , es ist ein handliches Werkzeug in der Philosophie Tradition Unix zu machen; Sie können Dateien jedoch auch direkt bearbeiten, indem Sie den -i unten angegebenen Parameter verwenden.
Beachten Sie Folgendes :

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

s/ zu verwendet s ubstitute den gefundenen Ausdruck few mit asd :

Die Wenigen, die Tapferen.


Der Asd, der Tapfere.

/g steht für "global" und bedeutet dies für die gesamte Zeile. Wenn Sie das /g (mit s/few/asd/ , es muss immer drei Schrägstriche geben, egal was passiert) weglassen und few zweimal in derselben Zeile erscheinen, wird nur die erste few geändert in asd :

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


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

Dies ist unter bestimmten Umständen hilfreich, z. B. beim Ändern von Sonderzeichen am Anfang von Zeilen (z. B. durch Ersetzen der Mehr-als-Symbole, mit denen manche Benutzer vorheriges Material in E-Mail-Threads mit einem horizontalen Tabulator zitieren und später in der Zeile eine zitierte algebraische Ungleichung belassen unberührt), aber in Ihrem Beispiel, in dem Sie angeben, dass überall , wo es few vorkommt, es ersetzt werden soll, stellen Sie sicher, dass Sie das haben /g .

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

-i Option zu bearbeiten verwendet i n Platz auf der Datei hello.txt .

-e Option gibt die e xpression / Befehl ausgeführt werden soll, in diesem Fall s/ .

Hinweis: Es ist wichtig, dass Sie -i -e zum Suchen / Ersetzen verwenden. In diesem -ie Fall erstellen Sie eine Sicherungskopie jeder Datei, an die der Buchstabe "e" angehängt ist.


8


2017-11-23

Das können Sie machen:

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

Beispiele: Um alle Vorkommen [logdir ',' '] (ohne []) durch [logdir', os.getcwd ()] in allen Dateien zu ersetzen, die das Ergebnis des Befehls locate sind, gehen Sie wie folgt vor:

ex1:

 locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"
 

ex2:

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

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


2


2018-07-24