Ich versuche, Zeichen aus einer Zeichenfolgenvariablen zu entfernen. Es funktioniert bei mir sed
so:
MYVAR=--23ho02123ware38384you443d34o3434ingtod38384day-%§*#sfrf
echo ${MYVAR} | sed -e 's/[a-z][a-z0-9\-]*//g'
und ich bekomme:
--23%§*#
das ist was ich suche. Die Zeichenfolge sollte mit einem Buchstaben beginnen und nur Buchstaben, Ziffern und einen Bindestrich (-) enthalten. Gibt es eine Möglichkeit, dies durch bash
Ersetzen von Zeichenfolgen zu erreichen ?
MYVAR=${MYVAR/[a-z][a-z0-9-]*/ }
Ich habe mehrere Kombinationen ausprobiert, aber keine davon funktioniert wie erwartet.
Antworten:
Sie müssten die erweiterten ksh-Glob-Operatoren (von denen eine Teilmenge in
bash
withshopt -s extglob
und withzsh
with verfügbar istset -o kshglob
) verwenden, um das Äquivalent regulärer Ausdrücke zu erhalten (allerdings mit einer anderen Syntax:*(x)
für das Äquivalent vonx*
hier):Oder mit
zsh
extendedglob
s, wo das Äquivalent von regulärem Ausdruck*
ist#
:Ein paar Anmerkungen:
${var/pattern/replacement}
ersetzt nur das erste Vorkommen. Verwenden${var//pattern/replacement}
jedes Vorkommen zu ersetzen (wie mit derg
Fahne insed
‚s -s
Befehl).${var//pattern/}
(oder${var//pattern}
), um durch die leere Zeichenfolge zu ersetzen.echo
beliebigen Zeichenfolgen ausgebenzsh
müssen Variablenerweiterungen in Listenkontexten in Anführungszeichen gesetzt werdensed
Ansatz unterscheiden, wenn die Variable Zeilenumbrüche enthält.[a-z]
Übereinstimmungen, die zwischen Zeichen (Elemente in einigen Werkzeugen Kollationieren)a
undz
die Liste der sich ändert mit den Lokalisierungs, das System und das Werkzeug (beispielsweise[a-z]
mitbash-4.3
in einemen_GB.UTF-8
locale auf einem GNU System entsprichtA
,X
,é
,Ẃ
, aber nichtZ
). Dies schließt im Allgemeinen die 26 Kleinbuchstaben des englischen Alphabets ein, muss aber nicht.[[:alpha:]]
Enthält Zeichen (oder Sortierelemente), die in Ihrem Gebietsschema als alphabetisch (unabhängig von der Groß- und Kleinschreibung) betrachtet werden. Wenn Sie nur mit den 26 englischen Buchstaben übereinstimmen möchten, verwenden[abcdefghijklmnopqrstuvwxyz]
oder korrigieren Sie das Gebietsschema aufC
(LC_ALL=C
) und verwenden Sie[a-z]
oder nur[[:lower:]]
für englische Kleinbuchstaben oder[a-zA-Z]
/[[:alpha:]]
für jeden englischen Brief.[a-z0-9\-]
insed
stimmt mit dem Backslash-Zeichen überein, verwenden Sie[a-z0-9-]
stattdessen (das-
muss das erste oder letzte sein, um wörtlich genommen zu werden).quelle
//
fürg
Flag im Gegensatz zu/
von OP verwendet wird, äquivalent ist und dass das letzte Leerzeichen in OPs Versuch das übereinstimmende Muster durch Leerzeichen ersetztshopt -s extglob
. Best