วิธีลบส่วนที่เหลือของแต่ละบรรทัดหลังจากรูปแบบที่แน่นอนหรือสตริงในไฟล์?


21

สมมติว่าฉันมีรายการ URL ในไฟล์ข้อความ:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

ฉันต้องการลบทุกอย่างที่เกิดขึ้นหลังจาก '.com'

ผลลัพธ์ที่คาดหวัง:

google.com
unix.stackexchange.com
isuckatunix.com

ฉันเหนื่อย

sed 's/.com*//' file.txt 

แต่มันก็ถูกลบ.comเช่นกัน


มีเหตุผลเฉพาะที่คุณต้องการค้นหา.comเท่านั้นแทนที่จะลบทุกอย่างหลังจากและรวมถึง/อักขระตัวแรกหรือไม่ ถ้าคุณมี URL เหมือนen.wikipedia.org/wiki/Ubuntuในรายการของคุณ
ผู้บัญชาการ Byte

คำตอบ:


17

หากต้องการลบทุกอย่างที่เกิดขึ้นหลังจาก ".com" ให้ปรับแต่งโซลูชัน sed ที่มีอยู่เพื่อแทนที่ ".com (อะไรก็ได้)" ด้วย ".com"

sed 's/\.com.*/.com/' file.txt

ฉันปรับแต่ง regex ของคุณเพื่อหลบหนีในช่วงแรก ไม่เช่นนั้นมันจะจับคู่บางอย่างเช่น "thisiscommon.com/something"

โปรดทราบว่าคุณอาจต้องการยึดรูปแบบ ".com" เพิ่มเติมด้วยเครื่องหมายสแลชต่อท้ายเพื่อให้คุณไม่ตัดเล็มอย่างเช่น "sub.com.domain.com/foo" โดยไม่ได้ตั้งใจ:

sed 's/\.com\/.*/.com/' file.txt

9

คุณสามารถใช้awkตัวคั่นฟิลด์ ( -F) ดังนี้:

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

คำอธิบาย:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

ในขณะที่คุณต้องการลบสิ่งที่ทุกหลัง.com, -F '.com'แยกสายที่มี.comและจะช่วยให้การส่งออกเพียงส่วนหนึ่งก่อนprint $1 .comดังนั้น$1".com"เพิ่ม.comและให้ผลลัพธ์ที่คุณคาดหวัง


ทำไมไม่/เป็นเพียงFSและใช้ฟิลด์แรก
heemayl


1
@Pandya: สิ่งนี้ล้มเหลวโดยใช้สตริงเช่นacomercial.com/asdsad
cuonglm

@conglm ขอบคุณที่ชี้นำ คำตอบที่ดีขึ้น
Pandya

4

exเครื่องมือที่ดีที่สุดสำหรับการแก้ไขไฟล์ไม่โต้ตอบในสถานที่เป็น

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

หากคุณเคยใช้viและหากคุณเคยพิมพ์คำสั่งที่เริ่มต้นด้วยโคลอน:คุณจะต้องใช้คำสั่ง ex แน่นอนคำสั่งขั้นสูงหรือ "แฟนซี" จำนวนมากที่คุณสามารถดำเนินการได้ด้วยวิธีนี้คือ Vim Extensions (เช่น:bufdo) และไม่ได้กำหนดไว้ในข้อกำหนด POSIX สำหรับexแต่รายละเอียดเหล่านั้นอนุญาตให้มีการศึกษาระดับปริญญาที่น่าอัศจรรย์อย่างแท้จริงของอำนาจและความยืดหยุ่นในการไม่เห็น การแก้ไขข้อความ (ไม่ว่าจะเป็นแบบโต้ตอบหรืออัตโนมัติ)

คำสั่งดังกล่าวมีหลายส่วน

-s เปิดใช้งานโหมดเงียบเพื่อเตรียมพร้อม exสำหรับการใช้งานเป็นกลุ่ม (ไม่แสดงข้อความเอาต์พุตและอื่น ๆ )

-c ระบุคำสั่งให้ดำเนินการครั้งเดียวไฟล์ (file.txtในกรณีนี้) ถูกเปิดในบัฟเฟอร์

% เป็นตัวระบุที่อยู่ที่เทียบเท่า 1,$ - หมายความว่าคำสั่งต่อไปนี้จะใช้กับทุกบรรทัดของบัฟเฟอร์

sเป็นคำสั่งทดแทนที่คุณน่าจะคุ้นเคยอยู่แล้ว มันถูกใช้โดยทั่วไปในviและมีคุณสมบัติเหมือนกันกับsคำสั่งของsedแม้ว่าคุณสมบัติขั้นสูงบางอย่างของ regex อาจแตกต่างกันไปตามการใช้งาน ในกรณีนี้จาก ".com" ถึงจุดสิ้นสุดของบรรทัดจะถูกแทนที่ด้วยเพียงแค่ ".com"

แถบแนวตั้งจะแยกคำสั่งตามลำดับที่จะดำเนินการ ในexการนำไปใช้(ส่วนใหญ่) คุณยังสามารถใช้-cตัวเลือกเพิ่มเติมเช่น:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

อย่างไรก็ตาม POSIX นี้ไม่จำเป็น

xออกคำสั่งหลังจากที่เขียนการเปลี่ยนแปลงใด ๆ ไปยังแฟ้ม ซึ่งแตกต่างจากwqที่หมายถึง "เขียนและออก" xเพียงเขียนไปยังไฟล์หากบัฟเฟอร์ได้รับการแก้ไข ดังนั้นหากไฟล์ของคุณไม่มีการเปลี่ยนแปลงการประทับเวลาจะถูกเก็บไว้


1
+1 สำหรับใช้อดีต
เจฟฟ์ Schaller

1
มันไม่ได้แก้ไขในสถานที่ อย่างน้อยก็ไม่ได้เป็นอะไรมากไปกว่าการsedปลอมแปลงของGnu มันอ่าน / เขียนไปยังบัฟเฟอร์บนดิสก์ ดูตัวเอง w / ex -rและpreserveคำสั่ง
mikeserv

@mikeserv preserveคำสั่งคืออะไร
Mateen Ulhaq

2

วิธีที่รวดเร็วมากเรียบง่ายและสกปรกหลาม:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

วิ่งตัวอย่าง

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
ฉันขอทราบเหตุผลของการโหวตได้ไหม
Sergiy Kolodyazhnyy

3
มันใช้งานได้ แต่มันไม่สนใจ.comมันแค่เอาทุกอย่างที่เริ่มต้นด้วยตัวแรก/ในบรรทัดออก (ซึ่งในความคิดของฉันยิ่งดีกว่า!)
ผู้บัญชาการ Byte

1
@ ByteCommander ถูกต้องแล้ว! หากชื่อโดเมนอยู่.netในแนวทางอื่นส่วนที่มาจากโดเมนและส่วนขยายจะไม่ถูกลบดังนั้นจึงปลอดภัยกว่าที่จะใช้/เป็นตัวคั่น
Sergiy Kolodyazhnyy

+1 สำหรับคำตอบและความคิดเห็นที่ทำให้ฉันรู้สึกเหมือนฉันอยู่ใน AskUbuntu.com: D
WinEunuuchs2Unix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.