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-sed
untuk menggunakangsed
perl -pe 's|\bone\b|two|g'
. Bekerja dengan stabil sementara sed gagal di sana-sini.
Gunakan \b
untuk 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 -E
memberi no bar embarassment$
.