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 ed (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 !