Verwenden von sed, um Zeichen <> loszuwerden,

18

Ich habe eine Datei mit folgenden Zeilen:

...
... <230948203[234]>, ...
... <234[24]>, ...
..

Ich möchte sed verwenden, um die Zeichen < ,und >aus jeder Zeile zu entfernen

Ich habe versucht, sed 's/<>,//g'aber es hat nicht funktioniert (es hat nichts geändert). Muss ich diesen Sonderzeichen entkommen? Ist es möglich, mehrere Zeichen mit einem einzigen sedBefehl zu löschen ?

Amelio Vazquez-Reina
quelle
2
bash-3.2$ echo "<230948203[234]>," | tr '<>,' ' '-> 230948203 [234] -EDITED Thanks to Paul
3
@srikanthradix: Wenn diese Zeichen nicht entfernt werden, werden sie durch Leerzeichen ersetzt. Sie wollen tr -d '<>,' ''(wie in Chris Downs Antwort).
Keith Thompson
1
@ KeithThompson:, tr -d '<>,'ohne '' am Ende nicht?
Benutzer unbekannt
@userunknown: Ja, danke für die Korrektur.
Keith Thompson

Antworten:

42

Mit sed:

sed 's|[<>,]||g'

Mit tr:

tr -d '<>,'
Chris Down
quelle
2
Richtig, aber ich persönlich finde die Verwendung |als Trennzeichen etwas verwirrend. sed 's/[<>]//g'ist etwas leichter zu lesen.
Keith Thompson
@ KeithThompson Ich benutze es aus praktischen Gründen. Ich habe |es viel weniger mit dem Wörtlichen zu tun (und muss ihm daher entkommen) als mit dem Wörtlichen /.
Chris Down
2
Ein fairer Punkt. Andererseits |ist es auch oft ein Metazeichen , das in einigen Regexp-Syntaxen zur Abwechslung verwendet wird (obwohl dies sedinsbesondere erforderlich ist \|). Persönlich verwende /ich normalerweise ,als Trennzeichen , wenn ich mit wörtlichen Zeichen umgehen muss .
Keith Thompson
1
Abgesehen von den oben erwähnten persönlichen / spezifischen Situationen gibt es einen wesentlichen Syntaxunterschied bei der Verwendung eines nicht standardmäßigen Trennzeichens. Das erste Nicht- / Begrenzungszeichen muss für jeden Sed-Range- Ausdruck printf 'a\nb\nc\n' | sed -n '\|a|,\|b|p'
maskiert werden
8

Probier diese: sed 's/[<>,]//g'

Iman
quelle
Wofür sind die vertikalen Balken da?
Paul Tomblin
sed 's / [<|> |] / / g' - Das s führt die Suche durch; das / ist das Trennzeichen; die [] Klammern lassen uns nach mehr als einer Sache suchen; die | Der vertikale Balken ist ein logisches oder und das g ist die globale Suche oder die gesamte Datei.
Iman
3
Du brauchst (oder willst) das |s nicht in dir []. verwenden 's/[<>,]//g'.
Kevin
2
Sie brauchen keine vertikale Leiste. Alles in den eckigen Klammern wird als Liste gesucht. sed 's/[<>,]/ /g'wird genau funktionieren, war gut, außer Ihre Idee wird vertikale Balken ebenso entfernen.
Paul Tomblin
Füge hinzu: Vielleicht möchten Sie sich mit regulären Ausdrücken befassen, dies ist eines der einfachsten Beispiele, zeigt aber bereits die Kraft.
Bernhard