Câu trả lời:
\ b trong biểu thức chính quy khớp với ranh giới từ (nghĩa là vị trí giữa ký tự từ đầu tiên và ký tự không phải từ):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
lưu ngày :)
Trên Mac OS X, cả hai cú pháp regex này đều không hoạt động bên trong sed để đối sánh toàn bộ các từ
\bmyWord\b
\<myWord\>
Nghe tôi bây giờ và tôi tin rằng sau đó, này cú pháp xấu xí là những gì bạn cần phải sử dụng:
/[[:<:]]myWord[[:>:]]/
Vì vậy, ví dụ, để thay thế bạc hà bằng bạc hà chỉ cho toàn bộ các từ:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Nguồn: re_format man page
sed
(và mọi công cụ GNU khác) thông qua MacPorts hoặc Homebrew và đảm bảo nó xuất hiện trước tiên trong bạn PATH
. Có thể làm cho một máy Mac khá khả dụng.
brew install coreutils
, tiền tố của tất cả các công cụ gnu.
brew install gnu-sed
để sử dụnggsed
perl -pe 's|\bone\b|two|g'
. Hoạt động ổn định trong khi sed bị lỗi chỗ này chỗ kia.
Sử dụng \b
cho ranh giới từ:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Ý của bạn rõ ràng là sed -i 's/\boldtext\b/newtext/g'
Trong một máy của tôi, việc phân định từ bằng " \b
" (không có dấu ngoặc kép) không hoạt động. Giải pháp là sử dụng " \<
" để bắt đầu dấu phân cách và " \>
" để kết thúc dấu phân cách.
Để giải thích bằng ví dụ của Joakim Lundberg :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
trong lệnh shell:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
hoặc là:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
nhưng nếu bạn đang ở trong vim, bạn chỉ có thể sử dụng sau này:
:% 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
cho no bar embarassment$
.