ลบบรรทัดทั้งหมดที่ขึ้นต้นด้วย # จากไฟล์


182

#ทุกสายที่มีความคิดเห็นในไฟล์ที่เริ่มต้นด้วย ฉันจะลบบรรทัดทั้งหมด (และเฉพาะบรรทัดเหล่านั้น) ที่เริ่มต้นด้วยได้#อย่างไร บรรทัดอื่นที่มี#แต่ไม่ใช่ที่จุดเริ่มต้นของบรรทัดควรละเว้น


1
มันจะต้องทำงานกับการประชุมทั่วไปที่#blah \<nl>blahนับเป็น "ตรรกะบรรทัด" เดียวเพราะเครื่องหมายแบ็กสแลชหนีขึ้นบรรทัดใหม่หรือไม่
sarnold

@sarnold: นอกจากmakeนี้ยูทิลิตีใดที่ใช้ 'backslash splices lines ก่อนที่จะจบความคิดเห็น' เชลล์ (ทดสอบ bash และ ksh) ไม่ C และ C ++ ทำหน้าที่จัดการการขึ้นบรรทัดใหม่ก่อนที่จะประมวลผลคำสั่ง preprocessor อื่น ๆ แต่พวกเขากำลังสั่งมากกว่าความคิดเห็น
Jonathan Leffler

@ Jonathan: เยี่ยมมาก ฉันสันนิษฐานว่าการ\<nl>หลบหนีร่วมกันอาจใช้ความคิดเห็น แต่ว้าวฉันผิด ฉันยังไม่สามารถหาตัวอย่างอื่นได้ ... :) ขอบคุณ!
sarnold

คำตอบ:


301

ซึ่งสามารถทำได้ด้วยsed one-liner :

sed '/^#/d'

สิ่งนี้บอกว่า "ค้นหาทุกบรรทัดที่ขึ้นต้นด้วย # และลบออกทิ้งทุกอย่างไว้"


9
รุ่นที่สั้นกว่า:sed /^#/d
kev

80
สำหรับ noux linux เช่นฉัน:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan

49
รุ่นที่สั้นที่สุด: sed -i '/^#/d' filepath.
lesderid

14
และsed -i '' '/^#/d' filepathบน Mac ( เพราะต้องใช้คำต่อท้าย -i )
paulcm

1
@Viesturs ลองนี้: awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger

56

ฉันประหลาดใจเล็กน้อยที่ไม่มีใครแนะนำวิธีแก้ปัญหาที่ชัดเจนที่สุด:

grep -v '^#' filename

วิธีนี้จะช่วยแก้ปัญหาตามที่ระบุไว้

แต่โปรดทราบว่าการประชุมทั่วไปมีไว้สำหรับทุกสิ่งตั้งแต่ a #ถึงจุดสิ้นสุดของบรรทัดเพื่อให้ถือว่าเป็นความคิดเห็น:

sed 's/#.*$//' filename

แม้ว่าจะมีการปฏิบัติเช่น#ตัวละครในสตริงตัวอักษรเป็นจุดเริ่มต้นของความคิดเห็น (ซึ่งอาจหรืออาจจะไม่เกี่ยวข้องกับกรณีของคุณ) (และมันออกจากบรรทัดที่ว่างเปล่า)

บรรทัดที่ขึ้นต้นด้วยช่องว่างตามอำเภอใจตามด้วย#อาจถือว่าเป็นความคิดเห็น:

grep -v '^ *#' filename

ถ้าช่องว่างเป็นเพียงช่องว่างหรือ

grep -v '^[  ]#' filename

โดยที่ช่องว่างทั้งสองนั้นเป็นช่องว่างตามด้วยอักขระแท็บตัวอักษร (พิมพ์ "แท็บ control-v")

สำหรับคำสั่งเหล่านี้ให้ละเว้นfilenameอาร์กิวเมนต์ที่อ่านจากอินพุตมาตรฐาน (เช่นเป็นส่วนหนึ่งของไพพ์)


ฉันได้เพิ่มคำตอบใหม่ซึ่งสร้างขึ้นจากคำตอบนี้
คิวเมนตัส

ฉันมีปัญหาในการใช้ grep ด้วยวิธีนี้ใน Windows วิธีแก้คือการแทนที่ 'ด้วย "เช่นgrep -v "^#" filename
Serg

14

ตรงกันข้ามกับทางออกของเรย์มอนด์:

sed -n '/^#/!p'

"ไม่พิมพ์อะไรเลยยกเว้นบรรทัดที่ไม่ได้ขึ้นต้นด้วย #"


9

คุณสามารถแก้ไขไฟล์ของคุณโดยตรงด้วย

sed -i '/^#/ d'

หากคุณต้องการลบบรรทัดความคิดเห็นที่ขึ้นต้นด้วยช่องว่างใช้

sed -i '/^\s*#/ d'

โดยปกติแล้วคุณต้องการให้บรรทัดแรกของสคริปต์ของคุณถ้ามันเป็น SHA-ปังจึงไม่ควรลบเส้นที่เริ่มต้นด้วยsed #!นอกจากนี้ควรลบบรรทัดที่มีเฉพาะแฮช แต่ไม่มีข้อความ รวบรวมทั้งหมดเข้าด้วยกัน:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

เพื่อให้สอดคล้องกับตัวแปรย่อยทั้งหมดคุณต้องเพิ่มส่วนขยายสำรองใน-iตัวเลือก:

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

1
บวก 1 สำหรับอันที่ว่าง
deepaksingh pawar


5

คำตอบนี้สร้างเมื่อก่อนหน้านี้คำตอบโดยคี ธ

egrep -v "^[[:blank:]]*#" ควรกรองบรรทัดแสดงความคิดเห็น

egrep -v "^[[:blank:]]*(#|$)" ควรกรองทั้งความคิดเห็นและบรรทัดว่างเนื่องจากมีประโยชน์บ่อย

สำหรับข้อมูลเกี่ยวกับ[:blank:]หลักสูตรและตัวละครอื่น ๆ ที่อ้างถึงhttps://en.wikipedia.org/wiki/Regular_expression#Character_classes


สมมติว่าคุณegrepรองรับไวยากรณ์นั้น รุ่นที่เก่ากว่าอาจไม่
Keith Thompson

-3

นี่คือลูปสำหรับไฟล์ทั้งหมดที่มีนามสกุล:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.