it-swarm.com.de

Nicht-alphanumerische Zeichen mit sed entfernen

Ich versuche, einige Eingaben zu überprüfen, um eine Gruppe von Zeichen zu entfernen. Erlaubt sind nur alphanumerische Zeichen plus, Punkt, Unterstrich, Bindestrich. Ich habe den Regex-Ausdruck [^\w.-] hier http://gskinner.com/RegExr/ getestet und er stimmt mit dem überein, was ich entfernen möchte. Ich weiß nicht, warum sed das Gegenteil zurückgibt. Was vermisse ich?

Mein Ziel ist es, "Â10.41.89.50 " einzugeben und "10.41.89.50 "abzurufen.

Ich habe es versucht:

echo "Â10.41.89.50 " | sed s/[^\w.-]//g gibt Â... zurück

echo "Â10.41.89.50 " | sed s/[\w.-]//g und echo "Â10.41.89.50 " | sed s/[\w^.-]//g gibt Â10418950 zurück

Ich habe versucht, die Antwort hier zu finden Überspringen/Nicht-ASCII-Zeichen mit sed entfernen aber nichts wurde entfernt.

29
gorideyourbike

tr Das -c (Complement) Flag kann eine Option sein 

echo "Â10.41.89.50-._ " | tr -cd '[[:alnum:]]._-'
39
iruvar

Möglicherweise möchten Sie stattdessen die Klasse [:alpha:] verwenden:

echo "Â10.41.89.50 " | sed "s/[[:alpha:].-]//g"

sollte arbeiten. Wenn nicht, müssen Sie möglicherweise Ihre lokalen Einstellungen ändern.

Wenn Sie dagegen nur die Ziffern, die Bindestriche und den Punkt beibehalten möchten:

echo "Â10.41.89.50 " | sed "s/[^[:digit:].-]//g"

Wenn sich Ihre Zeichenfolge in einer Variablen befindet, können Sie reine Bash- und Parametererweiterungen verwenden.

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[^[:digit:].-]/}
$ echo "$clean"
10.41.89.50

oder

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[[:alpha:]]/}
$ echo "$clean"
10.41.89.50

Sie können sich auch die Antwort von 1_CR ansehen.

11
gniourf_gniourf

Nun, Sed unterstützt keine Unicode-Zeichen. Verwenden Sie stattdessen Perl:

> s="Â10.41.89.50 "
> Perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
5
anubhava

Verwenden Sie diesen Code, um alle Zeichen außer alphanumerischen Zeichen und "-" zu entfernen:

echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"
0
panticz

Basierend auf der Antwort von Anubhava hat diese für mich funktioniert:

s/^[[:alnum:]]//g

Alles andere als alphanumerisch durch ein Leerzeichen ersetzt.

Hinweis: "." Zeichen bleiben erhalten

0
Iwan Plays
<`[[:alnum:][email protected]]`

Das hat für mich gut funktioniert. Es behielt alle Charaktere, die ich für meine Zwecke angegeben hatte.

0
technerdius