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
;)