Bagaimana cara mencari dan mengganti seluruh kata menggunakan sed?
Perbuatan
sed -i 's/[oldtext]/[newtext]/g' <file>
juga akan mengganti kecocokan parsial [oldtext]yang tidak saya inginkan.
Bagaimana cara mencari dan mengganti seluruh kata menggunakan sed?
Perbuatan
sed -i 's/[oldtext]/[newtext]/g' <file>
juga akan mengganti kecocokan parsial [oldtext]yang tidak saya inginkan.
Jawaban:
\ b dalam ekspresi reguler cocok dengan batas kata (yaitu lokasi antara karakter kata pertama dan karakter bukan kata):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b menyelamatkan hari ini :)
Di Mac OS X, tak satu pun dari sintaks regex ini bekerja di dalam sed untuk mencocokkan seluruh kata
\bmyWord\b\<myWord\>Dengarlah aku sekarang dan percayalah kemudian, ini sintaks jelek adalah apa yang Anda butuhkan untuk digunakan:
/[[:<:]]myWord[[:>:]]/Jadi, misalnya, untuk mengganti mint dengan minty hanya untuk seluruh kata:
sed "s/[[:<:]]mint[[:>:]]/minty/g"Sumber: halaman manual re_format
sed(dan setiap alat GNU lainnya) melalui MacPorts atau Homebrew dan pastikan itu yang pertama di PATH. Dimungkinkan untuk membuat Mac cukup berguna.
brew install coreutils, yang mengawali semua alat gnu.
brew install gnu-seduntuk menggunakangsed
perl -pe 's|\bone\b|two|g'. Bekerja dengan stabil sementara sed gagal di sana-sini.
Gunakan \buntuk batasan kata:
sed -i 's/\boldtext\b/newtext/g' <file>
[]: o,l-> [newtext],[newtext]. Anda jelas bermaksud sed -i 's/\boldtext\b/newtext/g'
Di salah satu mesin saya, membatasi kata dengan " \b" (tanpa tanda kutip) tidak berhasil. Solusinya adalah menggunakan " \<" untuk memulai pembatas dan " \>" untuk mengakhiri pembatas.
Untuk menjelaskan dengan contoh Joakim Lundberg :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
dalam perintah shell:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
atau:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
tetapi jika Anda berada di vim, Anda hanya dapat menggunakan nanti:
:% s/\<old\>/new/g
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Ememberi no bar embarassment$.