Aby wyodrębnić joebloggs
z tego ciągu w bash za pomocą rozwijania parametrów bez żadnych dodatkowych procesów ...
MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*} # retain the part before the colon
NAME=${NAME##*/} # retain the part after the last slash
echo $NAME
Nie zależy od joebloggs
przebywania na określonej głębokości ścieżki.
Podsumowanie
Przegląd kilku trybów rozszerzania parametrów, w celach informacyjnych ...
${MYVAR#pattern} # delete shortest match of pattern from the beginning
${MYVAR##pattern} # delete longest match of pattern from the beginning
${MYVAR%pattern} # delete shortest match of pattern from the end
${MYVAR%%pattern} # delete longest match of pattern from the end
Tak więc #
środki dopasować od początku (myślę linii komentarzu) i %
środków od końca. Jedna instancja oznacza najkrótszą, a dwie - najdłuższą.
Możesz uzyskać podciągi na podstawie pozycji za pomocą liczb:
${MYVAR:3} # Remove the first three chars (leaving 4..end)
${MYVAR::3} # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)
Możesz również zamienić poszczególne ciągi lub wzorce za pomocą:
${MYVAR/search/replace}
pattern
Jest w takim samym formacie jak plik nazwa-dopasowania, tak *
(wszystkie znaki) jest powszechne, często następuje konkretnego symbolu podobnego /
lub.
Przykłady:
Biorąc pod uwagę zmienną, taką jak
MYVAR="users/joebloggs/domain.com"
Usuń ścieżkę pozostawiając nazwę pliku (wszystkie znaki aż do ukośnika):
echo ${MYVAR##*/}
domain.com
Usuń nazwę pliku, pozostawiając ścieżkę (usuń najkrótsze dopasowanie po ostatnim /
):
echo ${MYVAR%/*}
users/joebloggs
Pobierz tylko rozszerzenie pliku (usuń wszystko przed ostatnim okresem):
echo ${MYVAR##*.}
com
UWAGA: Aby wykonać dwie operacje, nie możesz ich łączyć, ale musisz przypisać je do zmiennej pośredniej. Aby uzyskać nazwę pliku bez ścieżki lub rozszerzenia:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
zamiast%
. Jeśli chcesz tylko część za ostatnim dwukropkiem, użyj,${MYVAR##*:}
aby uzyskać część po pierwszym dwukropku, użyj${MYVAR#*:}
${RET##*$CHOP}
czy w ten${RET##*CHOP}
(lub w inny sposób)? EDYCJA: Wydaje się być pierwszym,${RET##*$CHOP}
Zdefiniuj taką funkcję:
I przekaż łańcuch jako parametr:
źródło
echo $1 | cut -d -f 1 | xargs
. +1 za proste i zgrabne odpowiedzi.A co z sedem? To zadziała w jednym poleceniu:
#
Są wykorzystywane do regex dzielniki zamiast/
ponieważ łańcuch ma/
w nim..*/
przechwytuje ciąg do ostatniego odwrotnego ukośnika.\( .. \)
oznacza grupę przechwytywania. To jest\([^:]*\)
.[^:]
Mówi dowolny znak _except dwukropkiem, a*
środki zero lub więcej..*
oznacza resztę linii.\1
oznacza zastąpienie tego, co zostało znalezione w pierwszej (i jedynej) grupie przechwytywania. To jest nazwa.Oto podział dopasowujący ciąg do wyrażenia regularnego:
źródło
Korzystanie z jednego seda
źródło
Korzystanie z jednego awk:
Oznacza to, że używa się również jako separatora pól
/
lub:
, nazwa użytkownika jest zawsze w polu 5.Aby zapisać go w zmiennej:
Bardziej elastyczna implementacja
sed
, która nie wymaga, aby nazwa użytkownika była polem 5:Oznacza to, że usuń wszystko z
:
i poza, a następnie usuń wszystko aż do ostatniego/
.sed
jest prawdopodobnie szybszy niżawk
, więc ta alternatywa jest zdecydowanie lepsza.źródło