Ich stecke hier in einem ziemlich trivialen Problem fest: Wie kann ich das *
Symbol in Bash auf Null oder mehr bringen , wie es in Tools wie z sed
.
Zum Beispiel ak*
sollte jede Datei übereinstimmen, deren Name vollständig aus einem a
gefolgt von null oder mehr k
s besteht. Seine Ausdehnung würde a
, ak
, akk
, und akkk
, aber nicht akc
.
Ich habe es bereits unsetopt sh_glob
in zsh und set -o noglob
in bash versucht ; Sie erzeugten nicht das gewünschte Verhalten.
ak*
insed
würde total übereinstimmenakc
(und auch nura
).^ak+$
oder^akk*$
würde funktionieren.Antworten:
Abgesehen davon
ksh93
hat keine der üblichen Shells reguläre Ausdrücke mit der gleichen Syntax wie sed, awk usw., die zum Abgleichen von Dateien verwendet werden können.Ksh93, bash und zsh haben reguläre Ausdrücke mit einer anderen Syntax, die mit Globs abwärtskompatibel ist:
?
stimmt mit einem einzelnen Zeichen.
überein (wie in der üblichen Regexp-Syntax)[…]
Entspricht einem Zeichensatz größtenteils auf die gleiche Weise*(FOO)
entspricht einer beliebigen Anzahl von Vorkommen vonFOO
(wie in der üblichen Regexp-Syntax)(FOO)*
+(FOO)
?(FOO)
@(FOO|BAR)
passt entwederFOO
oderBAR
*
am Anfang und am EndeDiese Syntax muss mit
shopt -s extglob
in bash und mitsetopt ksh_glob
in zsh aktiviert werden . Also würdest du in Bash schreibenSiehe auch Warum funktioniert mein regulärer Ausdruck in X, aber nicht in Y?
Ksh93, zsh und bash können mit dem
=~
Operator des[[ … ]]
Konstrukts reguläre Ausdrücke mit erweiterten regulären Ausdrücken (im Grunde die Syntax von awk) für Zeichenfolgen abgleichen . Dies ist zwar nicht praktisch, um Dateien aufzulisten, aber wenn Sie es wirklich wollen, können Sie es tun.quelle
ls a*(k)
würde Ihnen bereits eine akzeptierte Antwort geben. Vielen Dank, dass Sie sich die Zeit genommen haben, diese gründliche Antwort zu geben.a(k)
gibt Syntaxfehler, daher nehme ich an, dass (foo) allein nicht die gesamte Syntax für diesen Teil ist.*(foo)
eher meinte als(foo)
. Ich habe eine Bearbeitung vorgeschlagen , um die Formatierung zu korrigieren.ksh93
Globs können reguläre Ausdrücke verwenden:echo ~(E:ak*)
für ERE.ls ak{k,}
zeigt Dateien an, die mit beginnen,ak
gefolgt von einem anderenk
oder nichts.Globs sind keine regulären Ausdrücke, aber sie bieten mehr als nur
*
und?
.Wenn Sie reguläre Ausdrücke verwenden möchten, um passende Dateinamen zu finden, können Sie den folgenden
find
Befehl verwenden:Die
-maxdepth 1
Option beschränkt die Suche nur auf das aktuelle Verzeichnis (es werden keine Unterverzeichnisse durchsucht).Wenn Sie Suchanfragen ohne Berücksichtigung der Groß- und Kleinschreibung wünschen, verwenden Sie
-iregex
statt-regex
.Es gibt zahlreiche Methoden zur Verwendung der Dateien, die
find
in anderen Befehlen gefunden wurden. Zum Beispiel:Das letzte Beispiel ist anfällig für verschiedene Fehlermodi, darunter 1. Nichtbewältigung von Leerzeichen usw. in Dateinamen, 2. Begrenzung der Befehlszeilenlänge. nicht empfohlen.
quelle
k
's haben. Ich werde die Frage bearbeiten, um dies widerzuspiegeln.man 7 glob
- im Gegensatz zu Regex hat Glob keinen Modifikator für Null oder mehr oder 1 oder mehr.In
bash
der Syntax können Sie verwenden , ist:ls a+(k)
Das hängt von derbash
shopt
Shell - Optionextglob
aktiviert ist. Unter Ubuntu 14.04 GNU / Linux scheint dies standardmäßig aktiviert zu sein.So funktioniert es:
Aus dem Bash-Handbuch:
Weitere Informationen finden Sie im Bash-Handbuch unter https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching .
quelle
Einige Optionen je nach Shell:
(Damit
nobareglobqual
dieser Trailing hier(k)
nicht als Glob-Qualifier angesehen wird)zsh
's#
ist das Äquivalent von Regexp*
.ksh93
kann auch verschiedene Arten von regulären Ausdrücken in seinen Globs verwenden:quelle