Apakah ada cara untuk mengatakan sed
hanya menghasilkan kelompok yang ditangkap? Misalnya diberi input:
This is a sample 123 text and some 987 numbers
dan pola:
/([\d]+)/
Bisakah saya mendapatkan hanya output 123 dan 987 dengan cara diformat oleh referensi belakang?
sed
harus mengaktifkan ekspresi reguler yang diperluas dengan-E
bendera.Jawaban:
Kunci untuk membuat ini bekerja adalah untuk mengatakan
sed
untuk mengecualikan apa yang tidak Anda inginkan sebagai output serta menentukan apa yang Anda inginkan.Ini mengatakan:
-n
)p
)Secara umum, dalam
sed
Anda menangkap grup menggunakan tanda kurung dan output apa yang Anda ambil menggunakan referensi kembali:akan menampilkan "bar". Jika Anda menggunakan
-r
(-E
untuk OS X) untuk regex yang diperluas, Anda tidak perlu keluar dari tanda kurung:Mungkin ada hingga 9 kelompok penangkapan dan referensi belakang mereka. Referensi belakang diberi nomor sesuai urutan munculnya kelompok, tetapi mereka dapat digunakan dalam urutan apa pun dan dapat diulang:
menghasilkan "bilah a".
Jika Anda memiliki GNU
grep
(mungkin juga berfungsi di BSD, termasuk OS X):atau variasi seperti:
The
-P
pilihan memungkinkan Perl Regular Expressions Kompatibel. Lihatman 3 pcrepattern
atauman 3 pcresyntax
.sumber
sed
contoh, jika Anda menggunakan-r
opsi (atau-E
untuk OS X, IIRC) Anda tidak perlu keluar dari tanda kurung. Perbedaannya adalah antara ekspresi reguler dasar dan ekspresi reguler lanjutan (-r
).Sed memiliki hingga sembilan pola yang diingat tetapi Anda harus menggunakan tanda kurung yang lolos untuk mengingat bagian dari ekspresi reguler.
Lihat di sini untuk contoh dan lebih detail
sumber
sed -e 's/version=\(.+\)/\1/' input.txt
ini masih akan menampilkan seluruh input.txt\+
alih-alih+
. Dan saya tidak mengerti mengapa orang-e
hanya menggunakan satu perintah sed.sed -e -n 's/version=\(.+\)/\1/p' input.txt
lihat: mikeplate.com/2012/05/09/...sed -E
menggunakan apa yang disebut ekspresi reguler "modern" atau "extended" yang terlihat jauh lebih dekat dengan Perl / Java / JavaScript / Go / apa pun rasanya. (Bandingkan dengangrep -E
atauegrep
.) Sintaks default memiliki aturan pelarian yang aneh dan dianggap "usang". Untuk info lebih lanjut tentang perbedaan antara keduanya, jalankanman 7 re_format
.Anda bisa menggunakan grep
sumber
o
pilihan ada di sana - unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, --only-matching Tampilkan hanya bagian dari garis yang cocok yang cocok dengan POLAgrep -Eow -e "[0-9]+" -e "[abc]{2,3}"
Saya tidak tahu bagaimana Anda dapat mengharuskan kedua ekspresi itu berada di satu baris selain dari perpipaan dari grep sebelumnya (yang masih bisa tidak bekerja jika salah satu pola cocok lebih dari satu kali pada satu baris) ).jalankan digit
Jawaban ini berfungsi dengan jumlah kelompok digit apa pun. Contoh:
Jawaban diperluas.
Iya. ganti semua teks dengan grup tangkap:
Atau dengan sintaks yang diperluas (kurangi backquotes dan izinkan penggunaan +):
Untuk menghindari pencetakan teks asli ketika tidak ada nomor, gunakan:
Dan untuk mencocokkan beberapa angka (dan juga mencetaknya):
Itu bekerja untuk setiap hitungan digit berjalan:
Yang sangat mirip dengan perintah grep:
Tentang \ d
Sed tidak mengenali sintaks '\ d' (pintasan). Setara ascii yang digunakan di atas
[0-9]
tidak persis sama. Satu-satunya solusi alternatif adalah dengan menggunakan kelas karakter: '[[: digit:]] `.Jawaban yang dipilih menggunakan "kelas karakter" untuk membangun solusi:
Solusi itu hanya bekerja untuk dua digit digit.
Tentu saja, ketika jawaban dieksekusi di dalam shell, kita dapat mendefinisikan beberapa variabel untuk mempersingkat jawaban tersebut:
Tapi, seperti yang sudah dijelaskan, menggunakan
s/…/…/gp
perintah lebih baik:Itu akan mencakup kedua digit yang berulang dan menulis perintah (er) pendek.
sumber
Saya percaya pola yang diberikan dalam pertanyaan itu hanya dengan contoh saja, dan tujuannya adalah untuk mencocokkan pola apa pun .
Jika Anda memiliki sed dengan ekstensi GNU yang memungkinkan penyisipan baris baru dalam ruang pola, satu saran adalah:
Contoh-contoh ini dengan tcsh (ya, saya tahu itu shell yang salah) dengan CYGWIN. (Edit: Untuk bash, hapus set, dan spasi di sekitar =.)
sumber
+
, Anda harus menghindarinya atau menggunakan-r
opsi (-E
untuk OS X). Anda juga dapat menggunakan\{1,\}
(-r
atau-E
tanpa melarikan diri).Menyerah dan menggunakan Perl
Karena
sed
tidak memotongnya, mari kita membuang handuk dan menggunakan Perl, setidaknya itu adalah LSB sedangkangrep
ekstensi GNU tidak :-)Cetak seluruh bagian yang cocok, tidak perlu grup yang cocok atau yang terlihat di belakang:
Keluaran:
Kecocokan tunggal per baris, bidang data yang sering terstruktur:
Keluaran:
Dengan melihat di belakang:
Banyak bidang:
Keluaran:
Beberapa kecocokan per baris, seringkali data tidak terstruktur:
Keluaran:
Dengan melihat di belakang:
Keluaran:
sumber
Mencoba
Saya mendapatkan ini di bawah cygwin:
sumber
Bukan itu yang diminta OP (menangkap grup) tetapi Anda dapat mengekstraksi angka menggunakan:
Memberikan yang berikut:
sumber