Wie finde und ersetze ich einen String ohne den Befehl Sed?

Wie wir alle wissen, ist sed sehr effizient, um Zeichenfolgen zu finden und zu ersetzen, z. B. „a“ zu finden. und ersetzen Sie es durch „b“: sed "s/a/b/g".

Ist dies mit einem anderen Befehl oder Shell-Skript anstelle von sed?

Dies ist für zugeschnittene Linux-Systeme für das Fernsehen, die nicht über den Befehl sed verfügen. Ich muss also andere Befehle oder Skripte anstelle von sed "s/a/b/g". –

Kommentare

  • verwenden nur Substitution auf der Basis regulärer Ausdrücke. Jedes Tool oder jede Sprache, die dazu in der Lage ist, kann dasselbe tun, jedoch mit unterschiedlicher Syntax: $var=~s/a/b/g, gsub(/a/,"b",var), var.gsub(/a/,'b'), var.replace(/a/g,'b'), preg_replace("/a/","b",$var), regsub -all a b $var. Darüber hinaus können viele Tools und Sprachen auch Zeichenfolgen im Klartext ersetzen. Ihre Frage ist also irgendwie weit gefasst.
  • Warum? Welches Problem versuchen Sie zu lösen?
  • Ein beschnittenes Linux-System für das Fernsehen hat keinen Befehl erhalten. Ich muss also einen anderen Befehl oder ein anderes Skript verwenden, um anstelle von sed ‚ s / a / b / g ‚.

Antwort

Ja, es gibt verschiedene Möglichkeiten, dies zu tun. Sie können auch awk, perl oder bash verwenden, um diese Aktivitäten auszuführen. Im Allgemeinen ist sed wahrscheinlich das am besten geeignete Werkzeug für diese Art von Aufgaben.

Beispiele

Angenommen, ich habe diese Beispieldaten. in einer Datei data.txt:

foo bar 12,300.50 foo bar 2,300.50 abc xyz 1,22,300.50 

awk >

$ awk "{gsub("foo", "foofoofoo", $0); print}" data.txt foofoofoo bar 12,300.50 foofoofoo bar 2,300.50 abc xyz 1,22,300.50 

erl

$ perl -pe "s/foo/foofoofoo/g" data.txt foofoofoo bar 12,300.50 foofoofoo bar 2,300.50 abc xyz 1,22,300.50 

Inline-Bearbeitung

Oben Beispiele können die Dateien auch direkt ändern. Das Perl-Beispiel ist trivial. Fügen Sie einfach den Schalter -i hinzu.

$ perl -pie "s/foo/foofoofoo/g" data.txt 

Für awk „sa etwas weniger direkt, aber genauso effektiv:

$ { rm data.txt && awk "{gsub("foo", "foofoofoo", $0); print}" > data.txt; } < data.txt 

Diese Methode erstellt eine Sub-Shell mit den geschweiften Klammern“ {…} `, in der sich die Datei befindet über Folgendes umgeleitet:

$ { ... } < data.txt 

Sobald die Datei in die Sub-Shell umgeleitet wurde, wird sie gelöscht und dann awk wird für den Inhalt der Datei ausgeführt, die in die Unterschalen STDIN eingelesen wurde. Dieser Inhalt wird dann von awk verarbeitet und auf denselben Dateinamen zurückgeschrieben dass wir es gerade gelöscht haben und es effektiv ersetzt haben.

Kommentare

  • Vielen Dank für Ihre Antwort und ich werde es am nächsten Arbeitstag versuchen. Aber ich bin nicht sicher, ob Es funktioniert, weil einige Befehle in einem beschnittenen Linux-System von TV möglicherweise nicht vorhanden sind, wie z. B. ‚ sed ‚. Also möchte ich immer noch verwenden Befehl ‚ finde ‚, ‚ grep ‚ und so weiter, um es zu lösen.
  • @binghenzq – Ich ‚ habe Beispiele hinzugefügt, die die Datei inline bearbeiten.
  • -1 Ich stimme selten ab, aber in diesem Fall der Punkt von Die Frage schien eher eine einfachere Methode zu sein als andere komplexere und wahrscheinlich auch abhängige. Wenn es bei der Frage nur um Alternativen für eine vollständige * nix-Maschineninstallation ging, würde ich diese ansonsten gute Antwort wahrscheinlich +1 geben.
  • @MichaelDurrant – Ich habe gerade die aufwändigen Inline-Änderungen hinzugefügt, die das OP für sie angefordert hat . Außerdem hat das OP die Anforderung festgelegt, dass NOT sed not I verwendet. Sed ist das geeignete Werkzeug für Substitutionen wie diese, und er ‚ bittet offensichtlich darum, die Rollen dieser Tools besser zu verstehen. Jemandem diese Dinge zu zeigen, obwohl sie schlecht sind, ist äußerst lehrreich darin, ihnen zu zeigen, warum. Zu oft sagen die bekannten Personen einfach “ ‚ tun es nicht “ ohne zu erklären warum, so bin ich. Aber danke, dass du zumindest einen Kommentar hinterlassen hast, warum du DV bist.
  • Sicher, ich dachte, es war im Übrigen eine großartige Antwort. Ja, ich hasse -1 ohne Erklärung.

Antwort

Die klassische Alternative für Einzelbuchstabenersetzungen ist die tr Befehl, der auf nahezu jedem System verfügbar sein sollte:

$ echo "foobar" | tr a b foobbr 

tr ist dafür besser als sed, da sed (geschweige denn perl oder awk) für das Ersetzen einzelner Buchstaben entspricht der Verwendung eines Vorschlaghammers zum Töten einer Fliege.

grep ist nicht dafür ausgelegt, es ändert seine Eingabe nicht, es durchsucht sie nur.

Alternativ können Sie die Substitutionsfunktionen einiger Shells verwenden. Hier wird die Syntax ksh, zsh oder bash verwendet:

$ foo="foobar" $ echo "${foo//a/b}" foobbr 

Wir könnten Ihnen spezifischere Antworten geben, wenn Sie genau erklären, welches Problem Sie lösen möchten.

Kommentare

  • Gibt es eine Option, um Groß- / Kleinschreibung in ${foo//a/b} zu ignorieren?
  • @ AlikElzin-kilaka Ich ‚ habe Angst nicht. Sie ‚ müssen etwas Anspruchsvolleres verwenden, wie zum Beispiel: echo "$foo" | sed 's/a/b/i oder eine Zeichenklasse angeben: echo ${foo//[aA]/b}.

Antwort

Sie können das POSIX-Tool :

ex a.txt <<eof %s/Sunday/Monday/g xit eof 

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

Kommentare

  • Vielen Dank. Nur um hinzuzufügen, bedeutet das Flag -c, den Befehl auszuführen, wenn die Bearbeitung beginnt (da ex ein Editor ist), und das Flag -s ist entweder der Skriptmodus, der das Feedback deaktiviert, oder wie manche gerne den Slient-Modus sagen. Weitere Informationen finden Sie unter: ex-vi.sourceforge.net/ex.html

Antwort

Wenn Sie mit einer Datei und nicht mit einem Stream arbeiten, können Sie den Standardtexteditor ed:

printf "%s\n" ",s/a/b/g" w q | ed file.txt 

Dies sollte auf jedem * nix verfügbar sein. Das Komma in ",s/a/b/g" sagt ed, um an jeder Zeile zu arbeiten (Sie können auch % verwenden, was besser bekannt ist, wenn Sie an vim gewöhnt sind) und den Rest davon ist ein Standard suchen und ersetzen. w weist es an, die Datei zu schreiben (zu speichern), q weist sie an, sie zu beenden.

Beachten Sie, dass im Gegensatz zu Mit der Option „s -i (und ähnlichen Optionen in anderen Tools) wird die Datei tatsächlich direkt bearbeitet, anstatt mit temporären Dateien zu betrügen.

Ich ziehe an Ich glaube nicht, dass es möglich ist, dies mit Streams zum Laufen zu bringen, aber dann weiß ich nicht wirklich viel über ed und ich wäre nicht überrascht, wenn es tatsächlich diese Fähigkeit hätte (Die Unix-Philosophie ist das, was sie ist.)

Antwort

Verwenden des Vorfahren (wobei -s leise (leise) bedeutet und das Komma vor den Befehlen die Ausführung in allen Zeilen bedeutet):

Nur Drucken bei STDOUT :

ed -s file <<! ,s/a/b/g ,p q ! 

Ersetzen an Ort und Stelle:

ed -s file <<! ,s/a/b/g w q ! 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.