ฉันจะค้นหาและแทนที่ทั้งคำโดยใช้ 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$