Często znajduję to w skryptach (i muszę przyznać, że sam to piszę):
a=$(echo "$x" | sed "s/foo/bar/")
lub
if echo "$x" | grep -q foo
then
...
fi
Rozważ „foo”, aby uwzględnić niektóre wyrażenia regularne.
Czuję, że nie powinno być - i najczęściej jest - lepszy sposób na wyrażenie tego, jeden, który nie wiąże się z dwóch poleceń i fajki ale owija rzeczy do jakiegoś bardziej zwartej wypowiedzi.
Po prostu nie mogę tego znaleźć. Ktoś?
$()
raczej odwrotność.a="$(echo "$x" | sed "s/foo/bar/")"
iif echo "$x" | grep foo; …
.Odpowiedzi:
O ile nie założysz konkretnej powłoki, nie ma lepszego sposobu na zrobienie tego niż „echo potoku do narzędzia” (lub samo „narzędzie”, takie jak wyrażenie ); to wszystko, na co możesz naprawdę liczyć dzięki tradycyjnej powłoce Bourne'a i / lub powłoce POSIX . Jeśli weźmiesz pod uwagę inne powłoki, istnieje kilka innych wbudowanych możliwości.
ksh ma
?(pattern-list)
,*(pattern-list)
,{n}(pattern-list)
,{n,m}(pattern-list)
,@(pattern-list)
,!(pattern-list)
;%P
printf do konwersji rozszerzonego wyrażenia regularnego na wzorzec (i%R
rozszerzonego wyrażenia regularnego na wzorzec);expr == pattern
stan, w[[ expr ]]
badaniach;${param/pattern/replacement}
rozszerzenie parametrów.bash ma
extglob
opcja w celu umożliwienia większość dodatkowych wzorców ksh (no{n}
i{n,m}
);expr == pattern
warunek (w[[ expr ]]
badaniach);${param/pattern/replacement}
rozszerzenie parametrem;expr =~ extregexp
warunek (w[[ expr ]]
testach), który może pasować do rozszerzonych wyrażeń regularnychBASH_REMATCH
parametrem można było zastąpić styl sed .zsh ma
EXTENDED_GLOB
opcją;KSH_GLOB
opcją;expr == pattern
warunek (w[[ expr ]]
badaniach);${pattern/pattern/replacement}
rozszerzenie parametrem;expr =~ extregexp
warunek (w[[ expr ]]
testach), które można dopasować przeciwko rozszerzonych wyrażeń regularnych,MATCH
parametrem imatch
parametrem (lubBASH_REMATCH
zBASH_REMATCH
zestawem opcji) można było zastąpić styl sed ;zsh/pcre
moduł ofertypcre_compile
,pcre_study
, ipcre_match
poleceń oraz-pcre-match
testu (przydatność w[[ expr ]]
testach);zsh/regex
moduł, który oferuje-regex-match
testową warunek (w[[ expr ]]
testach).źródło
Aby zastąpić linię sed, zrób coś takiego
${a/foo/bar}
lub${a//foo/bar}
W pierwszej formie zastępowana jest tylko pierwsza instancja. Druga forma to globalne wyszukiwanie i zamiana.
W twoim przypadku byłoby
Zamiast:
Rozważ użycie:
Gdzie
foo
jest wyrażenie regularne.źródło
if [ $x =~ foo ]
wyświetla tutaj komunikat o błędzie.if [[ $x =~ foo ]]
działa jednak świetnie. Dzięki!=~
wymaga uderzenia> = 3 iirc.${a##foo}
i${a%%bar}
.=~
używa wyrażeń regularnych. Dotyczy to na przykład:[[ "abcdddde" =~ ^a.*d+.g* ]]
(to na przykład zero lub więcej g zamiast symboli wieloznacznych g).Dobrym sposobem na sprawdzenie, czy zmienna zawiera wzorzec, zgodny z posixem jest:
Składnia rozszerzenia parametru jest następująca:
gdzie
pattern
jest wzór powłoki .źródło