แยกและลบส่วนของสตริงระหว่างตัวคั่น


1

ฉันต้องการผ่านไฟล์และลบลำดับบางอย่างระหว่างตัวคั่น

ตัวอย่างเช่น

 drw---- 00000000 11111111        0 ./a/
 drw---- 00000000 11111111        0 ./b/
 d------ 00000000 11111111        0 ./c/
 d------ 00000000 11111111        0 ./d/k/
 d------ 00000000 11111111        0 ./e/l/r/
 d------ 00000000 11111111        0 ./f/m/s/x/
 ------- 00000000 11111111       89 ./g/n/t/y/C.xml
 dr----- 00000000 11111111        0 ./h/o/u/z/
 dr-r--- 00000000 11111111        0 ./i/p/v/A/D/
 d--r--- 00000000 11111111        0 ./j/q/w/B/

จะกลายเป็น

 drw---- ./a/
 drw---- ./b/
 d------ ./c/
 d------ ./d/k/
 d------ ./e/l/r/
 d------ ./f/m/s/x/
 ------- ./g/n/t/y/C.xml
 dr----- ./h/o/u/z/
 dr-r--- ./i/p/v/A/D/
 d--r--- ./j/q/w/B/

ตำแหน่งที่ตัวคั่นเริ่มต้นคือช่องว่างที่ 2 ในไฟล์และตัวคั่นสิ้นสุดคือ. /

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


ตัวคั่น <- นั่นคือวิธีที่คุณสะกดมัน คุณได้ถูกที่อื่น แต่ไม่ใช่ในหัวข้อ ขีด จำกัด ของคำอยู่ในนั้น
barlop

คำตอบ:


2

awkวิธีที่ง่ายที่สุดที่จะทำคือการใช้

$ awk '{print $1, $5}' myfile.txt

awkอ่านบรรทัดไฟล์โดยบรรทัดตั้งค่าตัวแปรพิเศษบางอย่างและรันคำสั่งสำหรับแต่ละบรรทัด $1และ$5ที่นี่มีสตริงที่หนึ่งและห้าเมื่อมีการโทเค็นบรรทัดโดยใช้ช่องว่างเป็น delimeter


ประณามนี่เป็นทางออกที่ดีขอบคุณมาก ฉันจะต้องอ่านบน GAWK ดูเหมือนว่ามันมีประโยชน์มาก
Millianz

2
นอกเสียจากว่าชื่อไฟล์จะมีช่องว่าง จากนั้นคุณอาจต้องการที่จะพูดawk '{$2=$3=$4=""; print}'
เกล็นแจ็คแมน

1

นี่คือ regex ที่คุณต้องการ sed the_expression oldname > newnameทั้งเปิดแฟ้มในกลุ่มและเรียกใช้มันหรือทำ

:%s/[0-9][0-9]*//g

คำอธิบาย:
สัญลักษณ์% ระบุว่าควรรันคำสั่งต่อไปนี้กับไฟล์ทั้งหมด
sหมายความว่าsearch/for this expression/and replace it with this one/
ในกรณีของคุณคุณต้องการลบตัวเลขทั้งหมดดังนั้นเราจึงแนะนำให้โปรแกรม regex ของ vim ค้นหาทุกครั้งที่มีหมายเลขหนึ่งหมายเลขขึ้นไปและแทนที่ด้วยหมายเลขใด ๆ


นี่เป็นวิธีที่ดีมากเช่นกัน gawk เป็นเรื่องง่ายเล็กน้อย แต่ถ้าคุณไม่คุ้นเคยกับ regex
Millianz

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

@barlop ฉันรู้ว่านี่เป็นวิธีที่รวดเร็วและสกปรกสำหรับข้อมูลในมือ
Yitzchak

1

"โดยที่ตัวคั่นเริ่มต้นคือช่องว่างที่ 2 ในไฟล์และตัวคั่นสิ้นสุดคือ. /"

นี่คือหนึ่งที่น่าเกลียดสำหรับคุณ

C:\sdf>type p.p
 drw---- 00000000 11111111        0 ./a/
 drw---- 00000000 11111111        0 ./b/
 d------ 00000000 11111111        0 ./c/
 d------ 00000000 11111111        0 ./d/k/
 d------ 00000000 11111111        0 ./e/l/r/
 d------ 00000000 11111111        0 ./f/m/s/x/
 ------- 00000000 11111111       89 ./g/n/t/y/C.xml
 dr----- 00000000 11111111        0 ./h/o/u/z/
 dr-r--- 00000000 11111111        0 ./i/p/v/A/D/
 d--r--- 00000000 11111111        0 ./j/q/w/B/
C:\sdf>sed -r "s/(\s+\S+\s*)([^.]*\.\/)/\1.\//" p.p
 drw---- ./a/
 drw---- ./b/
 d------ ./c/
 d------ ./d/k/
 d------ ./e/l/r/
 d------ ./f/m/s/x/
 ------- ./g/n/t/y/C.xml
 dr----- ./h/o/u/z/
 dr-r--- ./i/p/v/A/D/
 d--r--- ./j/q/w/B/
C:\sdf>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.