ฉันจะค้นหาและแทนที่ทั้งคำโดยใช้ sed ได้อย่างไร
การทำ
sed -i 's/[oldtext]/[newtext]/g' <file>
จะแทนที่การจับคู่บางส่วน[oldtext]
ที่ฉันไม่ต้องการให้ทำ
ฉันจะค้นหาและแทนที่ทั้งคำโดยใช้ sed ได้อย่างไร
การทำ
sed -i 's/[oldtext]/[newtext]/g' <file>
จะแทนที่การจับคู่บางส่วน[oldtext]
ที่ฉันไม่ต้องการให้ทำ
คำตอบ:
\ b ในนิพจน์ทั่วไปตรงกับขอบเขตของคำ (เช่นตำแหน่งระหว่างอักขระคำแรกและอักขระที่ไม่ใช่คำ):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
ช่วยให้วันนี้ :)
ใน Mac OS X ไวยากรณ์ regex เหล่านี้ไม่สามารถใช้งานได้ในsedสำหรับการจับคู่คำ
\bmyWord\b
\<myWord\>
ฟังฉันตอนนี้และเชื่อฉันในภายหลังไวยากรณ์ที่น่าเกลียดนี้คือสิ่งที่คุณต้องใช้:
/[[:<:]]myWord[[:>:]]/
ตัวอย่างเช่นในการแทนที่mintด้วยmintyสำหรับทั้งคำเท่านั้น:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
ที่มา: re_format man page
sed
(และเครื่องมือ GNU อื่น ๆ ) ผ่าน MacPorts หรือ Homebrew และตรวจสอบให้แน่ใจว่ามาก่อนในPATH
ไฟล์. เป็นไปได้ที่จะทำให้ Mac ใช้งานได้จริง
brew install coreutils
ซึ่งนำหน้าเครื่องมือ gnu ทั้งหมด
brew install gnu-sed
ใช้gsed
perl -pe 's|\bone\b|two|g'
มักจะเป็นทางออกที่ดีกว่า: ทำงานได้อย่างเสถียรในขณะที่ sed ล้มเหลวที่นี่และที่นั่น
ใช้\b
สำหรับขอบเขตคำ:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: ->o,l
[newtext],[newtext]
เห็นได้ชัดว่าคุณหมายถึง sed -i 's/\boldtext\b/newtext/g'
ในเครื่องของฉันการขีดฆ่าคำด้วย " \b
" (โดยไม่มีเครื่องหมายอัญประกาศ) ใช้ไม่ได้ วิธีแก้ปัญหาคือใช้ " \<
" สำหรับตัวคั่นเริ่มต้นและ " \>
" สำหรับการสิ้นสุดตัวคั่น
เพื่ออธิบายด้วยตัวอย่างของJoakim Lundberg :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
ในคำสั่งเชลล์:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
หรือ:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
แต่ถ้าคุณอยู่ในกลุ่มคุณสามารถใช้ได้ในภายหลังเท่านั้น:
:% 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
no bar embarassment$