Saya memiliki file ASCII yang berisi filepath yang saya baca dengan menjalankan:
while read p; do echo $p; done < filelist.txt
File tersebut berisi filepath dengan pola berikut:
./first/example1/path
./second/example1/path
./third/example2/path
Bagaimana saya bisa mendapatkan bagian tertentu dari string path (dari /
ke /
), misalnya saya perlu mendapatkan output yang dicetak:
first
second
third
dan juga
example1
example1
example2
Saya yakin ada cara untuk melakukan ini menggunakan ekspresi reguler dan sed
, tapi saya tidak terbiasa dengannya.
command-line
bash
text-processing
mcExchange
sumber
sumber
| cut -d/ -f3
pipa melakukan trik. Terima kasih! Ini adalah perintah lengkap sekarang:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Anda bisa melakukannya langsung di
read
perintah Anda , menggunakanIFS
variabel missumber
Kamu bisa menggunakan
awk
sumber
Jika kita menginginkan elemen jalan apa pun, yang terbaik adalah menggunakan sesuatu yang dapat memecah string menjadi bidang, seperti awk, memotong ,ular sanca, atau perl. Namun,pesta juga dapat melakukan pekerjaan dengan substitusi parameter, menggunakan penggantian pola dan membuang semuanya ke dalam array.
Sekarang kami memiliki berbagai item yang dibuat dari jalur. Perhatikan bahwa jika jalur berisi spasi, mungkin melibatkan mengubah pemisah bidang internal
IFS
.sumber
Bash dan
cut
adalah cara untuk pergi, namun alternatif menggunakan Perl:untuk bidang kedua yang
/
direvisi danuntuk bidang ketiga yang
/
direvisi.-l
: mengaktifkan pemrosesan akhir baris otomatis. Ini memiliki dua efek terpisah. Pertama, secara otomatis chomps $ / (pemisah rekaman input) saat digunakan dengan -n atau -p. Kedua, ia menetapkan $ \ (pemisah catatan output) untuk memiliki nilai octnum sehingga setiap pernyataan cetak akan memiliki pemisah yang ditambahkan kembali. Jika octnum dihilangkan, tetapkan $ \ ke nilai saat ini $ /.-a
: mengaktifkan mode autosplit saat digunakan dengan -n atau -p. Perintah split implisit ke array @F dilakukan sebagai hal pertama di dalam loop implisit saat diproduksi oleh -n atau -p.-n
: menyebabkan Perl untuk mengasumsikan loop berikut di sekitar program Anda, yang membuatnya iterate atas argumen nama file agak seperti sed -n atau awk:-e
: dapat digunakan untuk memasukkan satu baris program;print(@F[N])
: mencetak bidang Nth.sumber