Mam plik ASCII zawierający ścieżki plików, które czytam, uruchamiając:
while read p; do echo $p; done < filelist.txt
Plik zawiera ścieżki plików o następującym wzorze:
./first/example1/path
./second/example1/path
./third/example2/path
Jak mogę uzyskać określoną część ciągu ścieżki (od /
do /
), np. Muszę uzyskać wynik, który wyświetla:
first
second
third
i również
example1
example1
example2
Jestem pewien, że można to zrobić za pomocą wyrażeń regularnych sed
, ale nie jestem z tym zaznajomiony.
command-line
bash
text-processing
mcExchange
źródło
źródło
| cut -d/ -f3
w fajce załatwiło sprawę. Dzięki! To jest teraz pełne polecenie:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Możesz to zrobić bezpośrednio w swoim
read
poleceniu, używającIFS
zmiennej npźródło
Możesz użyć
awk
źródło
Jeśli chcemy dowolnego elementu ścieżki, najlepiej użyć czegoś, co może rozbić ciąg na pola, takie jak awk, skaleczenie ,pytonlub perl. Jednak,grzmotnąć może również wykonać zadanie z podstawieniem parametrów, używając zamiany wzorców i wrzucając wszystko do tablicy.
Teraz mamy szereg przedmiotów wykonanych ze ścieżki. Zauważ, że jeśli ścieżka zawiera spacje, może to wymagać zmiany wewnętrznego separatora pól
IFS
.źródło
Bash i
cut
są dobrą drogą, jednak alternatywą jest użycie Perla:dla drugiego
/
ograniczonego pola idla trzeciego
/
ograniczonego pola.-l
: umożliwia automatyczne przetwarzanie końca linii. Ma dwa osobne efekty. Po pierwsze, automatycznie używa komendy $ / (separator rekordów wejściowych), gdy jest używana z -n lub -p. Po drugie, przypisuje $ \ (separator rekordu wyjściowego), aby miał wartość octnum, dzięki czemu wszelkie instrukcje drukowania będą miały ponownie dodany separator. Jeśli octnum zostanie pominięty, ustawia $ \ na bieżącą wartość $ /.-a
: włącza tryb automatycznego podziału, gdy jest używany z -n lub -p. Ujawnione polecenie podziału na tablicę @F jest wykonywane jako pierwsza rzecz w niejawnej pętli while generowanej przez -n lub -p.-n
: powoduje, że Perl zakłada następującą pętlę wokół twojego programu, co powoduje iterację argumentów nazw plików, takich jak sed -n lub awk:-e
: może być użyty do wprowadzenia jednego wiersza programu;print(@F[N])
: drukuje n-te pole.źródło