HERE IT ISในแฟ้มที่มีจำนวนมากของสายฉันต้องการที่จะลบเส้นที่เริ่มต้นด้วย
ฉันจะทำได้โดยใช้เครื่องมือบรรทัดคำสั่งเท่านั้น
HERE IT ISในแฟ้มที่มีจำนวนมากของสายฉันต้องการที่จะลบเส้นที่เริ่มต้นด้วย
ฉันจะทำได้โดยใช้เครื่องมือบรรทัดคำสั่งเท่านั้น
คำตอบ:
ลองsed:
sed -i '/^HERE IT IS/d' <file>
คำเตือน:ควรสำรองข้อมูลเมื่อใช้-iสวิตช์sed:
sed -i.bak '/^HERE IT IS/d' <file>
ไฟล์ต้นฉบับจะยังคงเป็นและแฟ้มที่แก้ไขจะเป็น<file>.bak<file>
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' fileคุณสามารถใช้
นอกจากสิ่งที่ดีgrepและsedคำตอบที่คุณได้รับแล้วนี่คือเครื่องมืออื่น ๆ ที่สามารถทำสิ่งเดียวกัน:
วิธี Perl ไม่กี่:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
คุณสามารถเพิ่ม-iสวิตช์ลงในตัวอย่างใดก็ได้เพื่อแก้ไขไฟล์:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(ช) awk
awk '!/^HERE IT IS/' file > newfile
รุ่นที่ใหม่กว่า (4.1.1 ขึ้นไป) ของ GNU awk(ค่าเริ่มต้นawkบน Linux) ยังสามารถแก้ไขไฟล์ได้:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash, zsh, kshอาจจะเป็นคนอื่น ๆ ) มันค่อนข้างโง่ แต่ก็สามารถทำได้ แต่เครื่องมืออื่น ๆ ดีกว่า
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bashหนึ่งที่ทำให้ฉัน LOL)
printf "%s\n" "$line": อ้างถึง $ line เพื่อรักษาช่องว่างและหลีกเลี่ยงปัญหาเสียงก้อง (ตีความตัวอักษรพิเศษ ฯลฯ ) และหลีกเลี่ยงความจำเป็นที่จะต้องเพิ่ม--ด้วย
IFS=และ-rฉันอาจไปตลอดทางและทำให้มันแข็งแกร่ง
ฉันจะใช้grepเพื่อกรองพวกเขาออก ตัวอย่างเช่น :
grep -v "^HERE IT IS" infile > outfile
จากนั้นย้ายไฟล์ outfile กลับไป infile
sed เป็นวิธีที่จะไปแน่นอน
การแก้ไขเล็กน้อยของคำสั่ง @heemayl นี้ให้คุณจะลบบรรทัดไม่ว่ากรณีเดียวกันจะถูกใช้ในรูปแบบหรือไม่เนื่องจาก I ในการอ้างอิงรูปแบบ
sed -i '/HERE IT IS/Id' <file>
หากคุณมีหลายไฟล์ในไดเรกทอรีที่คุณต้องการทำเช่นนี้คุณสามารถรวมเข้ากับ find เช่น
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
ตัวเลือก maxdepth หมายความว่าสิ่งนี้จะไม่ถูกเก็บในไดเรกทอรี
ตัวเลือกหลามอื่น:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
โดยที่ f คือพา ธ ไปยังไฟล์ระหว่างเครื่องหมายคำพูด
grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)การยืนยันแบบ lookahead เชิงลบซึ่งทำให้เอ็นจิน regex จับคู่กับทุกเส้นเริ่มต้นของขอบเขต ( ซึ่งมักจะถูกจับคู่ด้วย^ ) เฉพาะในกรณีที่มันไม่ได้ตามด้วยสตริงHERE IT IS
หลาม
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
บันทึกสคริปต์ในไฟล์พูดscript.pyแล้วเรียกใช้คำสั่งด้านล่างบนเทอร์มินัล
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)] startswithฉันสงสัยว่า[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]จะไม่สร้างผลลัพธ์ในรายการได้อย่างไร
คุณสามารถใช้ Vim ในโหมด Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g ค้นหาทั่วโลก
d ลบ
x บันทึกและปิด
vimดังนี้:vim '+g/^HERE IT IS/d' +wq test.txt;)