misalkan, jika ada file yang terdiri dari baris berikut, jika ada
12345 567 7878 66 er3 t45t y6y46y 4y6 y656y y5y 46y6 65y7 y66uyuy yy46y6y
Outputnya harus seperti:
66 y6y46y yy y66uyuyy y46y6y
Saya telah mencoba sed 's/.* //g'
nama file perintah dan beberapa sed
perintah lain , tetapi tidak berfungsi.
Bisakah saya tahu apa sed
perintah tepatnya ?
text-processing
sed
awk
Rajeev Nukala
sumber
sumber
sed
?Jawaban:
Itu masih akan mencetak baris kosong untuk setiap baris kosong. Untuk menghindarinya:
sumber
sed -n 's/.*[[:blank:]]\+\([^[:blank:]]\+\)[[:blank:]]*$/\1/p'
..*
di bagian ekor, mungkin - Anda mengesampingkan apa pun kecuali tertinggal kosong w /.*[^[:blank:]]
.The
awk
variabel$NF
adalah bidang terakhir setiap record ; Anda dapat menggunakannya untuk mencetak hanya bidang terakhir dari file Anda seperti:sumber
Anda dapat mencoba :
sed 's/.* //'
awk '{print $NF}'
sumber
Kamu hampir sampai. Cukup tentukan kata terakhir:
Apa fungsinya:
(Diedit untuk menambahkan solusi yang lebih baik. Terima kasih Hildred!)
sumber
sed -r 's/.* ([^ ]+)/\1/g'
jika ekspresi reguler yang diperluas diizinkan, yang biasanya merupakan kasusnya.sed 's/.* //'
Anda dapat menggunakan beberapa pola yang cukup
grep
sebagai gantised
, misalnya:Dalam contoh ini,
[...]
rentang karakter yang dianggap sesuai untuk "kata" (alfanumerik dalam kasus ini, simbol lain dapat ditambahkan, beberapa di antaranya harus diloloskan).sumber
a-Z
sebagai jangkauan tidak masuk akal, bahkan di lokal berbasis ASCII. Perhatikan bahwa itu-o
adalah ekstensi GNU.Jika Anda memenuhi syarat kata yang berarti urutan 1 atau lebih karakter tidak kosong maka jawabannya pasti ya, dan itu sangat sederhana dilakukan juga. Ini karena
[[:blank:]]*
dan[^[:blank:]]*
merupakan pelengkap boolean dan - asalkan semua karakter dalam sebuah string lengkap -[[:blank:]]*
U[^[:blank:]]*
dapat menggambarkan string apa pun yang mungkin dengan cara yang sama.*
.Jika karakter yang tidak lengkap atau urutan byte yang tidak valid ada dalam suatu string, tidak satu pun dapat berhasil menggambarkannya secara langsung - seperti yang kadang-kadang dapat terjadi ketika menafsirkan string dalam pengkodean yang salah. Untuk memastikan karakter lengkap per byte dalam string apa pun, C locale dapat dipaksa seperti:
... yang akan menghindari masalah apa pun yang menggambarkan string dari kepala ke ekor dengan pola semua termasuk seperti
.*
atau([ ]*[^ ]*)*
Sebuah pola yang saling melengkapi dapat diulang sebanyak yang diperlukan dari kiri ke kanan sepanjang tali untuk mendarat pada kemungkinan yang terakhir terjadi tanpa ada kerusakan pada pola. Ini, secara pasti, adalah bahasa reguler.
BRE:
SEBELUM:
Kedua versi ini masih akan mencetak garis kosong, dan ini karena
*
bintang Kleene cocok dengan nol atau lebih kemunculan pola. Pertama-tama cocok dengan nol atau lebih bukan karakter kosong, lalu nol atau lebih karakter kosong, lalu nol atau lebih dari kecocokan yang dikelompokkan hingga cocok dengan string secara keseluruhan.Setelah mencocokkan semua ini, keajaiban terjadi dalam penggantian - referensi dikembalikan oleh kelompok
\1
dan\2
merupakan kejadian terakhir masing-masing. Jadi ketika penggantian dilakukan semua string diganti dengan hanya kejadian terakhir pada garis nol atau lebih bukan karakter kosong - atau subkelompok\2
.Tentu saja ini berfungsi untuk string apa pun - bahkan yang kosong - yang berarti kedua formulir akan mencetak karakter baris baru untuk baris yang hanya berisi karakter kosong atau tidak sama sekali. Untuk mengatasinya ada beberapa hal yang dapat Anda lakukan, tetapi pertama-tama mari kita buat kelas karakter sedikit lebih mudah untuk diketik:
Sekarang, untuk mencetak hanya jika satu baris berisi satu atau lebih karakter tidak kosong yang dapat Anda lakukan:
BRE:
SEBELUM:
Formulir mana pun akan bekerja dengan metode mana pun - selama sintaksinya benar.
The
-n
menonaktifkan saklar otomatis mencetak ruang pola, danp
bendera kes///
ubstitution atau/
alamat/
perintah mencetak hasil-hasilnya hanya jika berhasil.Logika yang sama ini dapat diterapkan untuk mendapatkan
{num}
kejadian apa pun , juga, seperti:BRE:
SEBELUM:
... di mana
num
di kedua regexps dapat diganti dengan angka untuk hanya mencetak{num}
kemunculan yang ditentukan dari urutan karakter yang tidak kosong. Bentuk yang sedikit berbeda digunakan di sini untuk memastikan penghitungan tidak condong untuk memimpin spasi dalam string.Perhatikan bahwa
-E
sakelar ERE untuksed
didukung dalam versi BSD dan GNU, meskipun belum sintaks standar POSIX.sumber
sed
(seperti Solaris / usr / bin / sed) dan akan lebih mahal daripada pendekatan yang lebih mudah (menghabiskan memori dengan jalur input lebih dari 25 karakter dengan misalnyased_su3
dari toolchest Heirloom). Jadi, meskipun saya suka jawabannya, saya tidak akan merekomendasikan pendekatan itu.s/.* \([^[:blank:]]\{1,\}\).*/\1/
jauh lebih baik, tetapi lebih sulit ketika beberapa baris terlibat. Namun, beberapa hari yang lalu, saya menemukan's/\(\n\)*/\1/g;s/\n\(\n.*\)*/&&/[num];s///[samenum]
bahwa secara efektif dapat menopang itu. Bagaimanapun, selama tidak ada kesalahan mencolok dalam logika maka saya senang - saya hanya berpikir saya pasti melewatkan sesuatu.sed
- itu agak aneh - itu harus terdengar sesuai dengan standar. xrat mengatakan ... Pengembang standar menganggap perilaku historis umum, yang mendukung"\n*"
, tetapi tidak"\n\{min,max\}", "\(...\)*"
, atau"\(...\)\{min,max\}"
, sebagai hasil yang tidak disengaja dari implementasi tertentu, dan mereka mendukung duplikasi dan interval ekspresi berikut subekspresi dan referensi-kembali.( '*' )
atau ekspresi interval (lihat item (5)), referensi-belakang harus cocok dengan yang terakhir (paling kanan) ) dari string ini. Saya cukup yakin saya menguji iniminised
meskipun - tentu saja saya sedang menguji sesuatu yang anehminised
beberapa hari yang lalu.Iya. Perintah sed berikut pertama-tama menghapus semua spasi spasi (
s/ *$//
) dan kemudian semuanya hingga dan termasuk spasi putih terakhir (s/.* //
). Mungkin perlu mengganti spasi putih dengan[[:blank:]]
untuk menangkap tab dan karakter seperti ruang lainnya.sumber
sumber