Wie wir alle wissen, sed
ist sehr effizient String finden, zum Beispiel ‚a‘ und ersetzen Sie es auf ‚b‘ zu finden und ersetzen: sed 's/a/b/g'
.
Ist es möglich, dies mit einem anderen Befehl oder Shell-Skript zu tun sed
?
Dies ist für ein abgeschnittenes Linux-System für das Fernsehen, das den sed
Befehl nicht hat . Also muss ich stattdessen andere Befehle oder Skripte verwendensed 's/a/b/g'. –
shell
text-processing
Binghenzq
quelle
quelle
$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
. Daneben können viele Tools und Sprachen auch Zeichenfolgen im Klartext ersetzen. Deine Frage ist also irgendwie weit gefasst.Antworten:
Ja, es gibt verschiedene Möglichkeiten, dies zu tun. Sie können auch
awk
,perl
oder verwendenbash
, um diese Aktivitäten auszuführen. Im Allgemeinensed
ist es jedoch wahrscheinlich das am besten geeignete Werkzeug für diese Art von Aufgaben.Beispiele
Angenommen, ich habe diese Beispieldaten in einer Datei
data.txt
:awk
Perl
Inline-Bearbeitung
Die obigen Beispiele können auch die Dateien direkt ändern. Das Perl-Beispiel ist trivial. Fügen Sie einfach den
-i
Schalter hinzu.Denn
awk
es ist ein bisschen weniger direkt, aber genauso effektiv:Diese Methode erstellt eine Sub-Shell mit den geschweiften Klammern "{...}", in die die Datei folgendermaßen umgeleitet wird:
Sobald die Datei in die Sub-Shell umgeleitet wurde, wird sie gelöscht und dann mit
awk
dem Inhalt der Datei abgeglichen, die in die Sub-Shells STDIN eingelesen wurde. Dieser Inhalt wird dann von verarbeitetawk
und in den gleichen Dateinamen zurückgeschrieben, den wir gerade gelöscht haben, und ersetzt ihn effektiv.quelle
sed
nicht I zu arbeiten. Sed ist das geeignete Werkzeug, um solche Substitutionen durchzuführen, und er bittet offensichtlich darum, die Rollen dieser Werkzeuge besser zu verstehen sie warum. Zu oft sagen die Leute im Wissen einfach "Tu es nicht", ohne zu erklären warum, also bin ich es. Aber danke, dass du wenigstens einen Kommentar hinterlässt, warum du DV.Die klassische Alternative für Einzelbuchstabenersetzungen ist der
tr
Befehl, der auf nahezu jedem System verfügbar sein sollte:tr
ist besser alssed
dies tatsächlich , da die Verwendungsed
(allein lassenperl
oderawk
) für einzelne Buchstabenersetzungen ist ein Schlitten Hammer wie mit einer Fliege zu töten.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 verwenden
ksh
,zsh
oderbash
Syntax:Wir könnten Ihnen genauere Antworten geben, wenn Sie genau erklären, welches Problem Sie lösen möchten.
quelle
${foo//a/b}
?echo "$foo" | sed 's/a/b/i
oder eine Zeichenklasse geben:echo ${foo//[aA]/b}
.Sie können Vim im Ex-Modus verwenden:
%
wähle alle Zeilen auss
Ersatzg
global ersetzenx
speichern und schließenquelle
Wenn Sie mit einer Datei anstatt mit einem Stream arbeiten, können Sie den Standard-Texteditor verwenden
ed
:Dies sollte auf jedem * nix verfügbar sein. Das Komma in
',s/a/b/g'
weist Sieed
an, in jeder Zeile zu arbeiten (Sie können es auch verwenden%
, was besser bekannt ist, wenn Sie an vim gewöhnt sind), und der Rest ist ein standardmäßiges Suchen und Ersetzen.w
Weist es an, die Datei zu schreiben (zu speichern)q
und zu beenden.Beachten Sie, dass im Gegensatz zur
-i
Option sed (und ähnlichen Optionen in anderen Tools) die Datei hierdurch tatsächlich direkt bearbeitet wird, anstatt mit temporären Dateien zu schummeln.Ich glaube nicht, dass es möglich ist, dies mit Streams zum Laufen zu bringen, aber dann weiß ich nicht viel darüber
ed
und würde mich nicht wundern, wenn es tatsächlich über diese Fähigkeit verfügt (die Unix-Philosophie ist das, was sie ist).quelle
Verwenden Sie den Befehl ancestor ed (in dem
-s
still (silent) und das Komma vor den Befehlen bedeutet, dass in allen Zeilen ausgeführt wird):Einfach auf STDOUT drucken :
an Ort und Stelle ersetzen:
quelle