หน้าเว็บ

วันอาทิตย์ที่ 9 ตุลาคม พ.ศ. 2554

วิธีการหา replace บรรทัดที่ขึ้นต้นด้วย pattern ด้วยข้อความใหม่

สมมติว่ามีไฟล์นึงอยู่ชื่อว่า file.txt โดยมีเนื้อหาดังนี้

hello world
how are you
hello man
Long time no see
no hello


ถ้าเราอยากจะเอาคำว่า "Hi" ไปแทนในทุกบรรทัดที่ขึ้นต้นด้วยคำว่า "hello" สามารถทำได้โดยใช้คำสั่ง sed ดังนี้


sed "s/^hello.*\$/Hi/" file.txt > temp
mv temp file.txt


คราวนี้เมื่อเปิดไฟล์ใหม่เนื้อหาก็จะถูกเปลี่ยนเป็น

Hi
how are you
Hi
Long time no see
no hello


โดย s หมายถึง search and replace
^hello.*\$ หมายถึงขึ้นต้นด้วย hello ไปจนสุดบรรทัด
Hi หมายถึงคำที่จะนำมา replace

ระบบที่ทดสอบ
OS: Ubuntu 11.04

วันพฤหัสบดีที่ 4 ธันวาคม พ.ศ. 2551

วิธีการ replace string ในหลายๆไฟล์ บน Linux

จริงๆแล้ววิธีการ replace string บน linux ทำได้หลายวิธี ขอลองนำเสนอ 2 วิธีด้วยกัน

วิธีแรก
ใช้ grep + perl
$ grep -rl OLDSTRING . | xargs perl -pi -e ’s/OLDSTRING/NEWSTRING/g’
วิธีที่สอง ใช้ grep + sed
$ grep -rl OLDSTRING . | xargs sed -e ’s/OLDSTRING/NEWSTRING/g’
อธิบาย
คำสั่ง grep จะช่วยเลือกไฟล์ที่มี OLDSTRING ประกอบอยู่โดยเริ่มตั้งแต่ current directory (.) เป็นต้นไป ซึ่งถ้าต้องการให้เริ่มที่ directory อื่นก็สามารถเปลี่ยน . เป็นรูปแบบอื่นได้

ส่วน option -r หมายถึงให้ recursive ทุกไฟล์และโฟลเดอร์
optoin -l หมายถึงเลือกเฉพาะไฟล์ที่มี OLDSTRING อยู่

ส่วน option ใน perl มีความหมายดังนี้
-e ที่อยู่ท้ายสุดคือ script ที่เราจะทำงาน นั่นคือคำสั่ง replace string global จาก OLDSTRING ให้เป็น NEWSTRING
-p คือให้ลูป script ด้วย
while (<>) {
# your script goes here
} continue {
print or die "-p destination: $!\n";
}
-i คือให้แทน <> ในลูปด้วยไฟล์ที่รับเข้ามา ซึ่งก็คือไฟล์ทั้งหมดที่รับมาจาก grep นั่นเอง

ส่วน xargs จะทำให้ perl รับอาร์กิวเมนต์ได้ไม่จำกัด คือ สามารถรองรับไฟล์จำนวนมากจาก grep ที่ส่งมาเป็นอาร์กิวเมนต์

ส่วนคำสั่ง sed นั้นเป็น stream editor ที่จะทำการ run คำสั่งที่ระบุไปยัง stream ของไฟล์ที่ส่งเข้ามาจาก grep
option -e คือ คือรับ expression script ที่จะกระทำกับ input ที่รับเข้ามา

ระบบที่ทดสอบ
OS: CentOS 5