วันอาทิตย์ที่ 2 มีนาคม พ.ศ. 2551

sed - stream editor (4)

3. ถ้าใน pattern มี / เป็นส่วนประกอบ

นั่นหมายความว่า คำสั่ง s จะมีปัญหาถ้าเราไม่หลบเครื่องหมายก่อน เพราะในคำสั่งมันต้องใช้ / เป็นตัวคั่นนั่นเอง

เช่น ถ้าต้องการแทนคำว่า /usr/local/bin ด้วยคำว่า /common/bin ของทั้งไฟล์ new.txt ก็จะต้องทำแบบข้างล่างนี้

sed 's/\/usr\/local\/bin/\/common\/bin/' new.txt
มองดูแล้วน่าเกลียดมาก อ่านไม่รู้เรื่องเลย ซึ่งลักษณะแบบนี้เขาเรียกว่า Packet Fence

ก็คือเวลาพิมพ์ เราจะต้องคิดว่าเรากำลังแทนที่ข้อความ \/usr\/local\/bin ด้วยคำว่า \/common\/bin

นอกจากจะใช้เครื่องหมาย / มาทำเป็นตัวคั่นของคำสั่งแทนที่แล้ว จริงๆแล้วเรายังสามารถใช้เครื่องหมายอื่นๆได้ด้วย ดูจากตัวอย่างข้างล่าง

sed 's_/usr/local/bin_/common/bin_' new.txt
sed 's:/usr/local/bin:/common/bin:' new.txt
sed 's|/usr/local/bin|/common/bin|' new.txt

ซึ่งทำให้เราไม่ต้องมานั่งเขียน packet fence ให้ยุ่งยาก (แต่ในสิ่งที่เราต้องการจะแทนที่และนำไปแทนที่จะต้องไม่มีสัญลักษณ์ที่ใช้แทนอยู่ในนั้น)

ไม่มีความคิดเห็น: