sed

sed ย่อมาจาก stream editor

sed เป็นโปรแกรมที่ใช้ process text file เช่น แทนที่ข้อความโดยระบุเป็น regular expression, แสดงบางบรรทัดของข้อความ, etc.

ตัวอย่างในโพสท์นี้ลองทำด้วย Mac OS


ข้อมูลในไฟล์ file1

gen 1 : 40 34
asdf
asdf
asdf
gen 2 : 53 36
asdf
asdf
gen 3 : 60 47
asdf
asdf
asdf
asdf


กรองบรรทัดที่มีคำว่า gen

grep gen file1

gen 1 : 40 34
gen 2 : 53 36
gen 3 : 60 47       

นับว่ามีกี่บรรทัดที่มีคำว่า gen โดยใช้คำสั่ง wc (word count แต่สามารถนับบรรทัด คำ ตัวอักษร (ไบท์) ได้) ออพชั่น l คือนับ line

grep gen file1 | wc -l

       3


ใช้ regular expression หาบรรทัดที่มีเลข 1 หรือ 7

grep '[17]' file1

gen 1 : 40 34
gen 3 : 60 47


เปลี่ยนคำว่า gen เป็น generation

เริ่มจากการกรองบรรทัดที่มีคำว่า gen

grep gen file1

gen 1 : 40 34
gen 2 : 53 36
gen 3 : 60 47       

ใช้คำสั่ง s ซึ่งย่อมาจาก substitute

grep gen file1 | sed 's/gen/generation/'

generation 1 : 40 34
generation 2 : 53 36
generation 3 : 60 47


ลบคำว่า gen

เริ่มจากการกรองบรรทัดที่มีคำว่า gen

grep gen file1

gen 1 : 40 34
gen 2 : 53 36
gen 3 : 60 47 
      

ใช้คำสั่ง substitute

grep gen file1 | sed 's/gen //'

1 : 40 34
2 : 53 36
3 : 60 47

(ต่อจากคำสั่งที่แล้ว) ลบเครื่องหมาย : (ต้องพิมพ์คำสั่งทั้งหมดในบรรทัดเดียวกัน สาเหตุที่ผมพิมพ์สองบรรทัดเนื่องจากมีปัญหาในการแสดงผล)

grep gen file1 | sed 's/gen //' | 
sed 's/ ://'

1 40 34
2 53 36
3 60 47

(ต่อจากคำสั่งที่แล้ว) เปลี่ยน space เป็นจุลภาค option โดยออพชั่น g เป็นการแทนที่วรรคทุกตัว

grep gen file1 | sed 's/gen //' | 
sed 's/ ://' | sed 's/ /,/g'

1,40,34
2,53,36
3,60,47

คำสั่งก่อนหน้า ถ้าไม่มี g จะแทนที่ space ตัวแรก

grep gen file1 | sed 's/gen //' | 
sed 's/ ://' | sed 's/ /,/'

1,40 34
2,53 36
3,60 47

ถ้าจะแทนที่ space ตัวที่สอง g ใช้ออพชัน 2

grep gen file1 | sed 's/gen //' | 
sed 's/ ://' | sed 's/ /,/2'
1 40,34
2 53,36
3 60,47

ถ้าจะเขียนผลการทำงานลงไฟล์ ให้เติม > ต่อด้วยชื่อไฟล์ เช่น

คำสั่งที่แล้ว > new_file


เปลี่ยน asdf เป็น asdf asdf asdf เครื่องหมาย & คือ string ที่ match

sed 's/asdf/& & &/g' file1

gen 1 : 40 34
asdf asdf asdf
asdf asdf asdf
asdf asdf asdf
gen 2 : 53 36
asdf asdf asdf
asdf asdf asdf
gen 3 : 60 47
asdf asdf asdf
asdf asdf asdf
asdf asdf asdf
asdf asdf asdf


อีกตัวอย่างหนึ่งที่ใช้ regular expression

ข้อมูลในไฟล์ file2

a   b c      d

ใช้ออพชั่น -E และ + ใน reg ex

cat file2 | sed -E 's/ +/_/g'

a_b_c_d

หรือ

cat file2 | sed -E 's/[[:space:]]+/_/g'

a_b_c_d

option E (ใน Mac) หมายถึง

-E
Interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE’s). The re_format(7) manual page fully describes both formats.

ใช้ออพชั่นนี้เพราะต้องการใช้ + (>= 1)


ตัวอย่าง เปลี่ยน เลขลบ เป็น (เลข) เช่น เปลี่ยน -50 เป็น (50)

cat file3 

10 -50 -40 30

cat file3 | sed -E 's/-([0-9]+)/(\1)/g'

10 (50) (40) 30

\1 หมายถึงส่ิงที่อยู่ใน ( ) แรก

ถ้าต้องการสลับเลขลบสองตัวที่อยู่ติดกัน

cat file3 | sed -E 's/(-[0-9]+) (-[0-9]+)/\2 \1/'

10 -40 -50 30

เลือกบรรทัดที่ต้องการ

sed -n 'บรรทัดเริ่มต้น,บรรทัดสุดท้าย p'

TextWrangler เจ๋งดี

  • ปิดโปรแกรมโดยไม่ได้ save file เปิดอีกครั้งข้อมูลเดิมยังคงอยู่
  • เปิดไฟล์ไว้ แล้วเปลี่ยนชื่อไฟล์โดยใช้คำสั่ง mv หรือใช้ Finder ไฟล์ที่เปิดอยู่ก็จะเปลี่ยนชื่อตามไปด้วย ฉลาดมาก

Sed – An Introduction and Tutorial by Bruce Barnett

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s