Saya mencoba mengekstrak nilai dari string panjang yang dapat berubah seiring waktu. Jadi misalnya string bisa terlihat seperti ini
....../filename-1.9.0.3.tar.gz"<....
Dan yang ingin saya ekstrak adalah nilai antara nama file- dan .tar.gz , pada dasarnya versi file (1.9.0.3 dalam kasus ini). Alasan saya perlu melakukannya dengan cara ini adalah karena nanti saya dapat menjalankan perintah dan nilainya akan menjadi 1.9.0.6 atau 2.0.0.2 atau sesuatu yang sama sekali berbeda.
Bagaimana saya bisa melakukan ini? Saat ini saya hanya menggunakan grep, tetapi saya tidak keberatan menggunakan utilitas lain seperti sed atau awk atau cut atau apa pun. Agar sangat jelas, saya hanya perlu mengekstrak versi file bagian dari string, karena sangat panjang (di kedua sisi) segala sesuatu yang lain perlu dipotong entah bagaimana.
Jawaban yang Diterima:
Dengan grep -P
/pcregrep
, menggunakan pandangan positif ke belakang dan pandangan ke depan yang positif:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
dalam kasus Anda, ganti STRING1
dengan filename-
dan STRING2
dengan .tar.gz
Jika Anda tidak memiliki akses ke pcregrep
dan/atau jika grep
. Anda tidak mendukung -P
Anda dapat melakukannya dengan alat pengolah teks favorit Anda. Inilah cara portabel dengan ed
yang memberi Anda hasil yang sama:
ed -s infile <<IN
g/STRING1/s//
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
Cara kerjanya:baris baru ditambahkan ke setiap STRING1
kemunculan (jadi sekarang ada paling banyak satu kemunculan per baris) maka semua baris tidak cocok dengan STRING1.*STRING2
dihapus; pada yang tersisa kami hanya menyimpan apa yang ada di antara STRING1
dan STRING2
dan cetak hasilnya.