Saya punya file ini:
sometext1{
string1
}
sometext2{
string2
string3
}
sometext3{
string4
string5
string6
}
Saya ingin mencari file ini untuk string tertentu dan mencetak semuanya sebelum string ini hingga pembukaan {
dan semuanya setelah string ini hingga penutupan }
. Saya mencoba untuk mencapai ini dengan sed tetapi jika saya mencoba untuk mencetak segala sesuatu dalam kisaran /{/,/string2/
misalnya cetak sed ini:
sometext1{
string1
}
sometext2{
string2
sometext3{
string4
string5
string6
}
Jika saya mencari string "string2" saya perlu output menjadi:
sometext2{
string2
string3
}
Terima kasih.
text-processing
sed
rodrigo
sumber
sumber
grep -n '' <infile | sed ...
.sed
Perintah - perintah perlu dimodifikasi; khususnya bit/
alamat/
yang mencari^
jangkar top-of-line. Jadi, jika Anda menggunakan jawaban saya Anda mungkin bisa melakukan:grep -n '' | sed 'H;/{$/h;/^[^:]*:}/x;/{\n.*PATTERN/!d'
. Semua baris output akan diawali dengan nomor baris file asli diikuti oleh titik dua seperti1:sometext1{\n2:string1
dan seterusnya.sed
akan menyaring hanya apa yang akan disaring sebelumnya, kecuali bahwa setiap jalur output terbuka dengan angka.Jawaban:
Berikut ini dua perintah. Jika Anda menginginkan perintah yang memotong hingga
.*{$
baris terakhir secara berurutan (seperti yang dilakukan @don_crisstied
), Anda dapat melakukannya:... yang bekerja dengan menambahkan setiap baris ke
H
ruang lama mengikuti\n
karakter ewline, menimpah
ruang lama untuk setiap baris yang cocok{$
, dan menukarh
ruang lama dan pola untuk setiap baris yang cocok^}
- dan dengan demikian menyiram buffernya.Ini hanya mencetak garis yang cocok dengan garis
{
lalu\n
dan kemudianPATTERN
di beberapa titik - dan itu hanya terjadi segera setelah buffer swap.Ini menghilangkan setiap baris dalam serangkaian
{$
pertandingan hingga yang terakhir dalam urutan, tetapi Anda bisa mendapatkan semua yang inklusif seperti:Apa yang dilakukannya adalah menukar pola dan
h
ruang lama untuk setiap...{$.*^}.*
urutan, menambahkan semua baris dalam urutan keH
ruang lama mengikuti\n
karakter ewline, danD
menghapus hingga\n
karakter ewline pertama yang muncul di ruang pola untuk setiap siklus baris sebelum memulai kembali dengan yang tersisa.Tentu saja, satu-satunya waktu yang pernah diperoleh
\n
garis dalam ruang pola adalah ketika baris input cocok^}
- akhir rentang Anda - dan ketika itu memutarkan kembali skrip pada kesempatan lain, ia hanya menarik baris input berikutnya seperti biasa.Ketika
PATTERN
ditemukan dalam ruang pola yang sama dengan\n
ewline, ia mencetak lot sebelum menimpanya^}
lagi (sehingga dapat mengakhiri rentang dan menyiram buffer) .Diberikan file input ini (terima kasih) :
Cetakan pertama:
... dan yang kedua ...
sumber
}
. Ini bisa bermanfaat untuk seperti ...open{\nsub;\n{ command; }\n}; close
- tapi saya tidak yakin apa yang terjadi di sini ...{...}
blok? Jika itu masalahnya dan Anda menggunakan solusi pertama maka Anda bisa melakukannya/{$/,/^}/H
di awal, bukan hanyaH
. Tetapi jika Anda juga mencoba solusi kedua dan masih mengalami kesalahan yang sama itu tidak akan membantu karena yang sudah melakukannya. Dan jangan diskoned
juga. don mendapat jawaban yang sangat baik di sini, daned
dapat diterapkan untuk menggunakan file buffer sementara dengan sangat sederhana, yang seharusnya mencegah mem buffer overruns.Inilah solusi dengan
ed
:itu adalah:
Ini mengasumsikan hanya ada satu baris dengan
PATTERN
antara setiap pasangan{
}
jika tidak, Anda akan mendapatkan hasil duplikat untuk setiap baris tambahan denganPATTERN
di dalam blok yang sama.Ini akan berfungsi untuk beberapa yang
{
}
berisi satu baris yang cocokPATTERN
misalnya untuk file uji denganPATTERN
di dua bagian yang berbeda:berlari
output:
sumber
Dengan
pcregrep
:Atau dengan GNU
grep
asalkan input tidak mengandung byte NUL:sumber
dimana:
string4
-> string untuk dicocokkant1.txt
-> berisi konten file yang disebutkan dalam kuerisumber
sed -n '/ string / p' nama file
-n ketika ditambahkan ke perilaku standar sed sed suppressed pernyataan ini mungkin tidak memberikan apa yang Anda inginkan, tetapi seharusnya hanya menggeser string
sumber