Seperti yang kita semua tahu, sed
adalah sangat efisien untuk mencari dan mengganti string, misalnya menemukan 'a' dan menggantinya dengan 'b': sed 's/a/b/g'
.
Apakah mungkin melakukan ini dengan perintah lain atau skrip shell bukan sed
?
Ini untuk sistem linux yang dipangkas untuk TV yang tidak memiliki sed
perintah. Jadi saya harus menggunakan perintah atau skrip lain, bukansed 's/a/b/g'. –
shell
text-processing
binghenzq
sumber
sumber
$var=~s/a/b/g
,gsub(/a/,"b",var)
,var.gsub(/a/,'b')
,var.replace(/a/g,'b')
,preg_replace("/a/","b",$var)
,regsub -all a b $var
. Selain itu, banyak alat dan bahasa juga dapat melakukan penggantian string teks biasa. Jadi pertanyaan Anda entah bagaimana luas.Jawaban:
Ya ada berbagai cara untuk melakukan ini. Anda dapat menggunakan
awk
,,perl
ataubash
melakukan aktivitas ini juga. Meskipun secara umumsed
mungkin merupakan alat yang paling tepat untuk melakukan tugas-tugas jenis ini.Contohnya
Katakanlah saya punya data sampel ini, dalam file
data.txt
:awk
Perl
Pengeditan sebaris
Contoh di atas dapat langsung memodifikasi file juga. Contoh Perl adalah sepele. Cukup tambahkan
-i
sakelar.Untuk
awk
itu sedikit kurang langsung tetapi sama efektifnya:Metode ini membuat sub-shell dengan kurung kurawal '{...} `di mana file diarahkan ke dalamnya melalui ini:
Setelah file diarahkan ke sub-shell, itu dihapus dan kemudian
awk
dijalankan terhadap konten file yang dibaca ke dalam sub-shell STDIN. Konten ini kemudian diproses olehawk
dan ditulis kembali ke nama file yang sama yang baru saja kita hapus, menggantikannya secara efektif.sumber
sed
bukan saya. Sed adalah alat yang tepat untuk melakukan pergantian seperti ini, dan dia jelas meminta untuk lebih memahami peran alat-alat ini, jadi menunjukkan kepada seseorang hal-hal ini meskipun buruk, sangat pendidikan dalam menunjukkan mereka kenapa. Terlalu sering orang yang tahu hanya mengatakan "jangan lakukan itu" tanpa menjelaskan alasannya, jadi saya. Tetapi terima kasih untuk setidaknya meninggalkan komentar mengapa Anda DV.Alternatif klasik untuk penggantian satu huruf adalah
tr
perintah yang harus tersedia di hampir semua sistem:tr
lebih baik daripadased
untuk ini sebenarnya karena menggunakansed
(apalagiperl
atauawk
) untuk penggantian huruf tunggal seperti menggunakan palu godam untuk membunuh seekor lalat.grep
tidak dirancang untuk ini, tidak mengubah inputnya, hanya mencari melalui itu.Atau, Anda dapat menggunakan kemampuan substitusi dari beberapa shell. Di sini menggunakan
ksh
,zsh
ataubash
sintaks:Kami dapat memberikan jawaban yang lebih spesifik jika Anda menjelaskan dengan tepat masalah apa yang Anda coba selesaikan.
sumber
${foo//a/b}
?echo "$foo" | sed 's/a/b/i
atau memberikan kelas karakter:echo ${foo//[aA]/b}
.Anda dapat menggunakan Vim dalam mode Ex:
%
pilih semua bariss
penggantig
ganti globalx
Simpan dan tutupsumber
Jika Anda bekerja dengan file daripada sungai, Anda bisa menggunakan editor teks standar,
ed
:Ini harus tersedia pada * nix apa pun. Tanda koma
',s/a/b/g'
memberi tahued
untuk bekerja pada setiap baris (Anda juga dapat menggunakan%
, yang akan lebih akrab jika Anda terbiasa vim), dan sisanya adalah pencarian standar dan ganti.w
memintanya untuk menulis (menyimpan) file,q
memintanya untuk keluar.Perhatikan bahwa, tidak seperti
-i
opsi sed (dan opsi serupa di alat lain), ini sebenarnya mengedit file di tempat daripada curang dengan file sementara.Saya tidak berpikir itu mungkin untuk mendapatkan ini bekerja dengan aliran, tapi kemudian saya tidak benar-benar tahu banyak tentang
ed
dan saya tidak akan terkejut jika itu benar-benar memiliki kemampuan itu (filosofi unix menjadi apa adanya).sumber
Menggunakan perintah ed leluhur (yang
-s
berarti tenang (silent) dan koma sebelum perintah berarti mengeksekusi di semua baris):Hanya mencetak pada STDOUT :
mengganti di tempat:
sumber