Jak wyciąć wszystkie znaki po ostatnim „/”?
Ten tekst
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
powinien wrócić
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Josef Klimuk
źródło
źródło
basename
idirname
zrób to już./
” stał się „Jak wyciąć wszystkie znaki po ostatnim” / ”? która jest zmianą frazowania, która w rozsądny sposób zachowuje znaczenie, IMO. Jeśli już, to czułem, że część „pomiń to, co jest ...” jest dwuznaczna: przykłady wydają się zachowywać to, co jest przed/
. Ten przykład w każdym razie wyjaśnia.Odpowiedzi:
Jeśli chcesz uzyskać „wyciętą część”
Możesz użyć
na przykład.
wynik
(Uwaga: Wykorzystuje to zdolność sed do używania separatora innego niż /, w tym przypadku |, w poleceniu s)
Jeśli chcesz uzyskać początek łańcucha:
Możesz użyć
na przykład.
wynik
źródło
#
zamiast/
. Ponadto można skorzystać z opcji-r
, jeśli nie chcą uciec `\` każdy znak specjalny:sed -r 's#(^.*)/.*$#\1#'
.Jeśli cięcie off końce strun,
dirname
może pasowały:Jeśli próbujesz wyizolować ostatnią część ciągu, użyj
echo /$(basename "$str")
.źródło
dirname
ibasename
nie są powszechnie znane, alesed
iawk
są.cat text | basename
nie będą działać. Właściwe rozwiązanie pytania OP przy użyciudirname
ibasename
wymagałobyxargs
itd.Rozszerzanie parametrów w
bash
W
bash
tym przypadku możesz użyć rozszerzenia parametrów${parameter%word}
gdzieword
jest/*
${parameter##word}
gdzieword
jest*/
Przykłady:
Usuń ostatnią część
Jest to opisane w
man bash
:Usuń wszystko oprócz ostatniej części
Możesz dodać ukośnik w ten sposób
aby uzyskać dokładnie to, czego chciałeś w jednym konkretnym przypadku zgodnie z edytowanym pytaniem. Ale pytanie zostało później zredagowane przez kilka osób i nie jest łatwo wiedzieć, czego chcesz teraz.
Jest to opisane w
man bash
:źródło
Innym sposobem jest
grep
wyświetlenie tylko ostatniego ukośnika w wierszu i wszystkiego, co następuje po nim:Wyjaśnienie:
-o
mówi,grep
aby wyświetlać tylko pasującą część linii zamiast całej linii.Wzór
/[^/]*$
pasuje do dosłownego ukośnika,/
po którym następuje dowolny znak, z wyjątkiem ukośnika[^/]
dowolną liczbę razy*
do końca linii$
.źródło
Tylko dlatego, że inni opublikowali więcej „rozsądnych” odpowiedzi, oto nieco głupia odpowiedź:
rev
odwraca znaki w każdej linii, np .abcd/ef/g
staje sięg/fe/dcba
. Następniecut
wycina pierwszy segment. Wreszcie jest odwrócone.źródło
Klasyczne rozwiązanie z
awk
, które traktuje/
jako separator pól dla danych wejściowych i wyjściowych i ustawia ostatnie pole na pusty ciąg znaków (co tak naprawdę jest „dereferencją”NF
zmiennej liczby pól ):Krótszy, jak zauważył fedorqui w komentarzach:
Odmianą byłoby umieszczenie ścieżki w
awk
środowisku wykonawczym, co pozwoli zaoszczędzić na hydraulice, ale sprawi, żeawk
część będzie bardziej szczegółowa:źródło
NF--
? W ten sposób avoudprint
bla bla.Dodanie do odpowiedzi egmonta, ponieważ pytanie zostało edytowane ...
Użyj --complement, jeśli chcesz usunąć pierwsze pole z -f1 .
Ponadto pytanie nie jest do końca jasne, co powinno się stać z danymi wejściowymi niezawierającymi żadnych ukośników. xxxx => xxxx lub xxxx => nic
źródło
--complement
opcji, a strona podręcznika jest okrągła. Uzupełnienie oznacza uzupełnienie. Znalazłem fajny tutorial, który obejmuje go na yourownlinux.com/2015/05/… To jest jak-v
wgrep
. Daj mi wszystko oprócz tego, co zostało dopasowane.-f2-
jest prostszą formą dla-f1 --complement
.