Saya akan mengirimkan formulir menggunakan cURL, di mana beberapa konten berasal dari file lain, dipilih menggunakan sed
Jika param1
pola pencocokan baris dari file lain menggunakan sed
, perintah di bawah ini akan berfungsi dengan baik:
curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit
Sekarang, pergilah ke masalah. Saya ingin hanya menampilkan teks di antara 2 pola yang cocok tidak termasuk pola yang cocok itu sendiri.
Katakanlah file.txt
mengandung:
Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
Saat ini, banyak sed
perintah "antara 2 pola yang cocok" tidak akan dihapus firstmatch
dan secondmatch
.
Saya ingin hasilnya menjadi:
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
text-processing
sed
lokomika
sumber
sumber
Jawaban:
Inilah salah satu cara Anda bisa melakukannya:
Dijelaskan: Dari baris pertama ke baris yang cocok dengan firstmatch , hapus. Dari baris yang cocok dengan secondmatch ke baris terakhir, hapus.
sumber
Dalam awk:
sumber
sed
Solusi lain akan gagal jikafirstmatch
terjadi pada baris 1 1 .Sederhanakan, gunakan rentang tunggal dan regex 2 kosong :
cetak semuanya dalam rentang itu, tidak termasuk ujung rentang (pencetakan otomatis dinonaktifkan) 3 :
atau, lebih pendek, hapus semua yang tidak ada dalam rentang itu dan hapus juga kisaran yang berakhir:
1: Alasannya adalah bahwa jika alamat kedua adalah regexp, maka memeriksa kecocokan akhir akan dimulai dengan garis mengikuti garis yang cocok dengan alamat pertama .
Oleh karena itu,
/firstmatch/
tidak pernah dievaluasi untuk baris pertama input,sed
hanya akan menghapusnya karena cocok dengan nomor baris1,/RE/
dan beralih ke baris 2 di mana ia memeriksa apakah baris cocok/firstpattern/
2: Ketika REGEX kosong (yaitu
//
)sed
berperilaku seolah-olah REGEX terakhir yang digunakan dalam perintah terakhir diterapkan (baik sebagai alamat atau sebagai bagian dari perintah pengganti) ditentukan.3:
;}
sintaksnya adalah untuksed
implementasi modern ; dengan yang lebih lama gunakan baris baru, bukan titik koma atau misalnya ekspresi terpisahsed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile
sumber
//
sedang dilakukan (di dalam{…}
)?//
berarti ungkapan reguler terakhir yang digunakan; dari semua yang saya baca, itu seharusnya/secondmatch/
. Saya telah memverifikasi melalui pengujian bahwa perintah Anda berfungsi, dan saya menyimpulkan bahwa itu berfungsi sebagai/firstmatch|secondmatch/
(yang telah Anda konfirmasi), tetapi saya tidak dapat menemukan dokumentasi apa pun (bahkan dokumen POSIX yang Anda tautkan ke atau GNU manual sed ) yang menjelaskan perilaku ini. ... (Lanjutan)sed
: (1) Jika saya melakukannya/first/,4
, maka//
bertindaklah seperti/first/
. (2) Jika saya melakukannya2,/second/
, maka//
mendapat kesalahan "tidak ada ekspresi reguler sebelumnya". (Saya menemukan ini kegagalan mencolok untuk mengikuti perilaku yang ditentukan.) (3) Menambahkan--posix
tidak mengubah salah satu di atas. (II) Dalam program lain: (4) Dalamvi
, setelah/first/,/second/
,//
tindakan seperti/second/
(dan bentuk lain juga merupakan implementasi rasional dari aturan yang didokumentasikan). … (Lanjutan)awk
tampaknya tidak memiliki gagasan tentang "RE terakhir yang digunakan";//
mengacu pada non-karakter sebelum atau setelah karakter apa pun. (Saya mengundang Anda untuk mencobaecho -- | awk '{ gsub(//, "cha"); print }'
.)/first|second/
. Beruntungnya kamu. Saya menyebutkan program lain untuk menunjukkan bahwa ini bukan konvensi regex seluruh sistem. Siapa pun yang menambahkannyased
tidak perlu menambahkannyavim
, di mana itu akan masuk akal. :-)