ฉันจะลบข้อความก่อนตัวคั่นใน Linux ได้อย่างไร


16

ฉันต้องการลบข้อความออกจากบรรทัดก่อนตัวคั่น

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

(123434): hello::{apple,orange,mango}.

:ฉันต้องการที่จะลบข้อความก่อนเป็นครั้งแรก (123434)กล่าวคือ

มีคำสั่งใดใน linux ที่จะทำงานนี้หรือไม่?


คุณอาจต้องการตรวจสอบsedหรือawk
พอล

ข้อความนี้เป็นส่วนหนึ่งของไฟล์หรือเป็นส่วนหนึ่งของตัวแปร bash หรือไม่?
Bernhard

มันเป็นส่วนหนึ่งของไฟล์
user80538

คำตอบ:


14

sedคำสั่งนี้ควรทำเคล็ดลับ คำสั่งต่อไปนี้จะเขียนทับไฟล์:

sed -i 's/^[^:]*:/:/' file

หากต้องการพิมพ์เอาต์พุตให้ลบ-iแฟล็ก หากต้องการวางเอาต์พุตในไฟล์ใหม่ให้ลบ-iแฟล็กและเปลี่ยนทิศทางเอาต์พุต:

sed 's/^[^:]*:/:/' file > new_file

บรรทัดใช้เวทมนตร์ ... เอาต์พุตแทนที่ในไฟล์เอง ..
80538

เมื่อฉันเปรียบเทียบสองไฟล์โดยใช้ sdiff หลังจากลบข้อความจากทั้งสองไฟล์ความแตกต่างแสดงให้ฉันเห็นข้อความที่ลบสำหรับฉัน คำสั่งนี้เขียนทับไฟล์หรือเพียงแค่แสดงผลลัพธ์
user80538

มันใช้งานได้ .. ฉันสามารถดึง 'hello' และ {apple, orange, mango} ออกจากตัวอย่างของฉันได้โดยการเปลี่ยนแปลงคำสั่งด้านบนอย่างง่ายหรือไม่?
user80538

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

เป็นการเปรียบเทียบง่าย ๆ ของไฟล์สองไฟล์ที่มีข้อมูลเดียวกัน แต่ต้องการค้นหาว่าข้อมูลแตกต่างกันแค่ไหนในสองไฟล์ ฉันต้องตรวจสอบแต่ละส่วนในบรรทัด ข้อมูลในแต่ละส่วนอาจสับสน เช่น {apple, orange, mango} สามารถเป็น {apple, mango, orange}
user80538


5

คุณสามารถทำได้ด้วยคำสั่งBash ที่ค่อนข้างง่าย:

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

: hello::{apple,orange,mango}.นี้จะพิมพ์ คุณสามารถตัดคำนำหน้าและคำต่อท้ายด้วยวิธีเดียวกัน ยิ่งกว่านั้นคำจำกัดความคำนำหน้าและคำต่อท้ายสามารถมีอักขระตัวแทน

ตัดคำนำหน้า - จับคู่ไวด์การ์ดของคำนำหน้าสูงสุด: ${variable#prefix}

ตัดคำนำหน้า - ตรงกับสัญลักษณ์ตัวแทนที่ตรงกันทั้งหมด: ${variable##prefix}

ตัดส่วนต่อท้าย - ตรงกับสัญลักษณ์ตัวแทนต่อท้ายแรก: ${variable%suffix}

ตัดส่วนต่อท้าย - สูงสุด wildcard ต่อท้ายที่ตรงกัน: ${variable%%suffix}

มันอาจดูไม่ชัดเจนตั้งแต่แรกเห็นดูตัวอย่างต่อไปนี้:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

ในตัวอย่างที่ผ่านมารูปแบบไม่ตรงกันดังนั้นจึงไม่มีอะไรถูกตัดออก


echo ${mytext#*:}:มันต้องการจะมีประสิทธิภาพมากขึ้นในการใช้งาน นี้อย่างถูกต้องจะจัดการกับสายเหมือนและ(123)(434): hello::{apple,orange,mango}. 123434: hello::{apple,orange,mango}
drs

มีวิธีใดบ้างที่จะแก้ไขคำสั่ง echo $ {mytext %% B *} เพื่อรับข้อความหลังจาก B. ในตัวอย่างของคุณ
user80538

@ user80538 ใช่เพียงตัดข้อความก่อน B รวมด้วย ;-) เช่น: $ {mytext # * B} สำหรับข้อความหลัง B แรกและ $ {mytext ## * B} สำหรับข้อความหลังจาก B สอง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.