Saya memiliki serangkaian format [0-9]+\.[0-9]+\.[0-9]
. Saya perlu mengekstraksi angka pertama, kedua, dan ketiga secara terpisah. Seperti yang saya pahami, kelompok tangkapan harus mampu melakukan ini. Saya harus bisa menggunakan sed "s/\([0-9]*\)/\1/g
untuk mendapatkan nomor pertama, sed "s/\([0-9]*\)/\2/g
untuk mendapatkan nomor kedua, dan sed "s/\([0-9]*\)/\3/g
untuk mendapatkan nomor ketiga. Namun dalam setiap kasus, saya mendapatkan seluruh string. Mengapa ini terjadi?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
menangkap nomor individual.Jawaban:
Kami tidak dapat memberikan jawaban lengkap tanpa contoh masukan Anda, tetapi saya dapat memberi tahu Anda bahwa pemahaman Anda tentang kelompok tangkapan salah. Anda tidak menggunakannya secara berurutan, mereka hanya merujuk pada regex di sisi kiri dari operator substitusi yang sama. Jika Anda menangkap, misalnya
/(foo)(bar)(baz)/
, makafoo
akan\1
,bar
akan\2
danbaz
akan\3
. Anda tidak dapat melakukannyas/(foo)/\1/; s/(bar)/\2/
, karena, dalams///
panggilan kedua , hanya ada satu grup yang ditangkap, jadi\2
tidak akan ditentukan.Jadi, untuk menangkap tiga grup digit Anda, Anda perlu melakukan:
Atau, yang lebih mudah dibaca:
sumber
/(foo)/
sed akan cocok dengan(
karakter literal , diikuti olehfoo
dan kemudian literal)
. Jika Anda ingin mengambil grup, Anda harus keluar dari tanda kurung atau menggunakan-E
opsi.-r
bendera jadi saya menganggap itu sebabnya saya belum menemukan ini.-r
bendera juga akan melakukan itu, tetapi tidak portabel. GNU sed mendukungnya tetapi banyak yang lain tidak. Itu-E
lebih universal.Contoh:
Atau, semuanya:
sumber
Gunakan Sed dengan -r, --regexp-extended untuk menghindari semua tanda kurung lolos.
sumber