ปล่อยให้เป็นพยายามที่จะดำเนิ sed คำสั่ง
ปล่อยให้พวกเราพิจารณาตัวอย่างแฟ้ม csv แฟ้มกันตามเนื้อหาภายใน:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- ต้องลบหน่วยที่ 1 ก็สนามหรือคอลัมน์:
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
นี่เงื่อนไขการค้นหาสำหรับอนุกรมของคนที่ไม่ใช่จุลภาค([^,]*)ตัวอักษรและลบพวกเขาซึ่งผลอยู่ในหน่วยที่ 1 ก็สนามจะถูกลบออกไป
- ที่จะพิมพ์เฉพาะจดหมายที่ได้รับล่าสุดสนามหรือลบทุกช่องข้อมูลยกเว้นคนสุดท้ายช่องข้อมูล:
$ sed 's/.*,//' file
11
2
3
4
5
นี่ regex เอาทุกอย่างจนคนสุดท้ายจุลภาค(.*,) ซึ่งผลอยู่ในการลบช่องข้อมูลทั้งหมดยกเว้นคนสุดท้ายสนาม
- เพื่อพิมพ์เดียวที่หน่วยที่ 1 ก็ช่องข้อมูล:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
นี่ regex(,.*) เอาที่ตัวอักษรเริ่มต้นจากหน่วยที่ 1 ก็จุลภาคมจนกว่าจะสิ้นผลลัพธ์จากอยู่ในการลบช่องข้อมูลทั้งหมดยกเว้นคนสุดท้ายสนาม
- แบบอักษรเพื่อทำการลบ 2 ช่องข้อมูล:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
ที่ regex(,[^,]*,)การค้นหาสำหรับจุลภาคงและลำดับของตัวอักษรตามด้วยจุลภาคซึ่งผลตรวจในตรงกับคน 2 คอลัมน์และก็แทนนี้รูปแบบตรงกับกับจุลภาค,ตอนจบท้ายที่สุดในการลบ 2 คอลัมน์
ข้อควรจำ:จะลบช่องข้อมูลในตอนกลางจะยิ่งยากขึ้นใน sed ตั้งแต่ทุกสนามต้นตรงกันกับเหมือนจะเป็นความจริง
- เพื่อพิมพ์เดียวที่ 2 ช่องข้อมูล:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
ที่ regex ตรงกับที่ก่อสสอนภาคสนามแล้วที่เหลืออย่างไรก็ตามกลุ่ม 2 ทุ่งอยู่คนเดียว คนทั้งหมดคือตอนนี้แทนที่ด้วยที่ 2 ทุ่(\1)จึงเพียง 2 ทุ่ถูกแสดง
- พิมพ์เดียวที่อยู่ในบรรทัดซึ่งคนสุดท้ายคอลัมน์เป็นโสดตัวเลขจำนวน:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
ที่ regex(,[0-9]$)เช็คสำหรับตัวเลขเดียวในสนามและค p คำสั่งรอยนิ้วมือเส้นซึ่งตรงกับเงื่อนไขนี้.
- ต้องจำนวนทุกบรรทัดอยู่ในแฟ้ม:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
นี่เป็นการจำลองของแมว-n กองบัญชาการ ภาษาโปรแกรม awklanguage section มันได้ง่ายๆโดยใช้ตัวแปรเป็นพิเศษลำดับ@label. กรอง'='คำสั่งของ sed ทำให้เส้นจำนวนของทุกๆสายตามด้วยสายตัวมันเอง ที่ sed ผลส่งออกเป็น piped อีก sed คำสั่งที่จะเข้าร่วมกับทุก 2 แล้วเราพลาดอะไรไปเนี่ย?
- แทนที่สุดท้ายที่สนามโดย 99 ถ้าหน่วยที่ 1 ก็ช่องข้อมูล'Ubuntu':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
นี่ regex ตรงกับ'Ubuntu'และจนกระทั่งสิ้นยกเว้นคนสุดท้ายคอลัมน์และกลุ่มกันของพวกเขาเช่นกัน ในการแทนที่ส่วนที่ 1 และ 2 กลุ่มพร้อมกับคนใหม่เลข 99 คือ substituted.
- ลบ 2 ทุ่ถ้าหน่วยที่ 1 ก็ช่องข้อมูล'@label:listbox kde distribution method':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
หน่วยที่ 1 ก็สนาม'@label:listbox kde distribution method'ที่ 2 ทุ่งและที่เหลือช่องข้อมูลรวมกลุ่มและเปลี่ยนที่นี่จบเรื่องเดียวที่ 1 และเมื่อกลุ่ม resuting ในที่ 2 ทุ่งโดนลบ
- จะแทรกใหม่คอลัมน์ที่สุด(เมื่อคอลัมน์):
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
ที่ regex(.*) ตรงกับคนทั้งสายออกและแทนที่มันที่บรรทัดที่ตัวมันเอง(&)และใหม่ของสนาม
- จะแทรกใหม่คอลัมน์ในการเริ่มต้น(1 คอลัมน์):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
เหมือนกับเมื่อตัวอย่างเช่นนแค่เส้นตรงกับเป็นตามโดยคอลัมน์แสดงผล view->
ฉันหวังว่านี่จะช่วยได้ บอกให้ฉันรู้ถ้าคุณต้องการที่จะใช้ภาษาโปรแกรม awklanguage section หรืออะไรอีกกองบัญชาการ
ขอบคุณ
sed -Ei "$rownum s/$newvalue/$col" file.csv
และมันทิ้งข้อผิดพลาดเกิดขึ้นระหว่างแต่อยากจะรู้มากกว่านี้เกี่ยวกับเรื่องนี้ มีทรัพยากรที่จะอ่านท่านจะต้องการความช่วยเหลือเหมือนกัน