Dalam file berikut:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut eu metus id lectus vestibulum ultrices. Maecenas rhoncus.
Saya ingin menghapus semuanya sebelum consectetuer
dan sesudahnya elit
.
Output yang saya inginkan:
consectetuer adipiscing elit.
Bagaimana saya bisa melakukan ini?
shell-script
text-processing
manuel
sumber
sumber
sed
. Bisa jugaperl
, atau bahkan bash murni.Jawaban:
Saya akan menggunakan sed
Mendekode sed s / find / replace / syntax:
s/^.*
- gantikan mulai dari awal baris (^
) diikuti oleh apa saja (.*
) hingga ...\(
- mulai blok bernamaconsectetuer.*elit\.
- cocok dengan kata pertama, semuanya (.*
) hingga kata terakhir (dalam hal ini, termasuk titik trailing (lolos)) yang ingin Anda cocokkan\)
- akhiri blok bernama.*
) hingga akhir baris ($
)/
- akhiri bagian cari pengganti\1
- ganti dengan blok nama antara yang\(
di\)
atas dan yang di atas/
- akhiri penggantiansumber
^
atau$
karena sed akan mencoba dan menemukan pasangan yang paling lama. Anda juga mungkin telah melewatkan titik setelahnyaelit
, Anda bisa memasukkannya\.
jika perlu.^
dan$
tidak perlu - saya meninggalkan mereka di sana sebagai penanya mencatat (awalnya) bahwa dia sedikit pemula dan ini mungkin membantu dalam konteks lain.Jika setiap baris berisi pola awal dan akhir maka cara termudah untuk melakukannya adalah dengan
grep
. Alih-alih menghapus awal dan akhir setiap baris, Anda cukup menampilkan konten di antara kedua pola. The-o
pilihan di GNUgrep
output hanya pertandingan:Catatan: seperti yang disebutkan, ini hanya berfungsi jika setiap baris dalam file dapat diuraikan dengan cara ini. Kemudian lagi, itu 80% dari semua kasus penggunaan khas.
sumber
Dua untuk loop di AWK:
AWK's gsub:
sumber
Cara Perl. Ini pada dasarnya sama dengan jawaban MikeV
sed
:The
-p
berarti "mencetak setiap baris setelah menerapkan script yang diberikan dengan-e
". Thes/foo/bar/
adalah operator substitusi; itu akan digantifoo
denganbar
. Tanda kurung menangkap pola dan mari kita gunakan dalam penggantian. Pola yang ditangkap pertama adalah$1
, yang kedua$2
dan seterusnya.Jadi, perintah akan mencocokkan semuanya hingga
consectetuer
(.*consectetuer
), lalu semuanya sampaielit
(.*elit
) dan kemudian yang lainnya sampai akhir baris (.*
) dan akan menggantinya dengan pola yang ditangkap.sumber
Saya tidak yakin mengapa judul pertanyaan ini telah diedit " dari file " ke " dari satu baris " sementara OP tidak mengecualikan kemungkinan di beberapa baris meskipun contohnya tampaknya hanya satu baris. Apa pun itu, mungkin bermanfaat untuk memberikan solusi beberapa jalur di sini.
Ini bekerja untuk garis silang:
Contoh:
referensi: Ekspansi Parameter Shell
sumber