Menghapus teks di antara dua string spesifik

10

Saya punya file seperti di bawah ini:

mime PI Name: ISHO SUCCESS RATE RT, Value: 95.663826
scr  PI Name: RRC Access Failures due to UU, Value: 0.13394141
prog PI Name: RRC Access Failures due to UU, Value: 0.16077702
sch PI Name: RRC Access Failures due to UU, Value: 0.11781933

Saya ingin menghapus teks PIhingga Value:. Saya mencoba

sed '/<PI>/,/<\/Value:>/d' 

Ada bantuan?

khalil saad
sumber

Jawaban:

20

Ganti semuanya dari PImenjadi Value:dengan string kosong:

sed 's/PI.*Value://'
danadam
sumber
10
Apakah ini akan berhasil jika PIdan Value:terjadi pada garis yang berbeda?
Brian Fitzpatrick
6

Menggunakan dperintah dalam sedakan menghapus seluruh baris. Juga, saya tidak yakin mengapa Anda menggunakan <dan >. Mungkin Anda membingungkan mereka \<dan \>yang grepdigunakan untuk menunjukkan batas kata? Dalam hal ini, Anda harus tahu bahwa sedpenggunaan \buntuk kedua jenis batas kata (awal dan akhir). Jadi Anda dapat menulis sesuatu seperti ini:

sed -i 's/\bPI\b.*\bValue:\b//' your_file

Untuk ketahanan ekstra, saya akan gunakan perluntuk kuantifikasi malas .sehingga Anda hanya menghapus teks antara kemunculan pertama PIdan kemunculan pertama Value:. Tentu saja itu semua tergantung pada use case Anda.

perl -pi -e 's{ \b PI \b .*? \b Value: \b}{}x' your_file
Joseph R.
sumber
1

Gunakan kode di bawah ini untuk menghapus beberapa garis antar pola (termasuk garis dengan pola):

sed "/PI/,/Value:/d" your_file

Jika Anda ingin memodifikasi file_Anda secara langsung:

sed -i "/PI/,/Value:/d" your_file
Feriman
sumber
Perhatikan perbedaannya di sini - ini menghapus garis dalam rentang, sementara pertanyaannya adalah meminta menghapus teks di antara dua string.
Jeff Schaller