วิธีลบบรรทัดทั้งหมดออกจากไฟล์ข้อความที่มีคำว่า "cat" และ "rat"
วิธีลบบรรทัดทั้งหมดออกจากไฟล์ข้อความที่มีคำว่า "cat" และ "rat"
คำตอบ:
grep
เข้าใกล้หากต้องการสร้างสำเนาของไฟล์โดยไม่มีบรรทัดที่ตรงกับ "cat" หรือ "rat" ไฟล์หนึ่งสามารถใช้grep
ใน reverse ( -v
) และด้วยตัวเลือกทั้งคำ ( -w
)
grep -vwE "(cat|rat)" sourcefile > destinationfile
ตัวเลือกทั้งหมดคำทำให้แน่ใจว่าจะไม่ตรงกันcats
หรือgrateful
เป็นตัวอย่าง การเปลี่ยนเส้นทางเอาต์พุตของเชลล์ของคุณถูกใช้ ( >
) เพื่อเขียนไปยังไฟล์ใหม่ เราต้องการ-E
ตัวเลือกในการเปิดใช้งานการแสดงออกปกติเพิ่มเติมสำหรับ(one|other)
ไวยากรณ์
sed
เข้าใกล้อีกทางหนึ่งหากต้องการลบบรรทัดในตำแหน่งที่สามารถใช้ได้sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
\b
ขอบเขตชุดคำและd
ดำเนินการลบเส้นที่ตรงกับการแสดงออกระหว่างทับไปข้างหน้า cat
และrat
ทั้งคู่มีการจับคู่โดย(one|other)
ไวยากรณ์ที่เราเห็นได้ชัดว่าต้องหลบหนีด้วยแบ็กสแลช
เคล็ดลับ: ใช้sed
โดยไม่มี-i
โอเปอเรเตอร์เพื่อทดสอบเอาต์พุตของคำสั่งก่อนเขียนทับไฟล์
(อิงจากSed - ลบบรรทัดที่มีสตริงที่ระบุ )
เพื่อทดสอบในเทอร์มินัลเท่านั้นใช้:
sed '/[cr]at/d' file_name
หากต้องการลบบรรทัดเหล่านั้นออกจากไฟล์ให้ใช้:
sed -i '/[cr]at/d' file_name
ลองใช้ vim-way:
ex +"g/[cr]at/d" -scwq file.txt
พิจารณาถ้าคุณมีไฟล์ที่มีfile_name
และคุณต้องการค้นหาเมาส์ แต่ในเวลาเดียวกันไม่กี่แถวจากเมาส์มีคำอื่น ๆ เช่นcat
และrat
และคุณไม่ต้องการที่จะเห็นผู้ที่อยู่ในการส่งออกของคุณดังนั้นวิธีหนึ่งที่จะทำก็คือ -
grep -r mouse file_name | grep -vE "(cat|rat)"
ทำงานใน/bin/sh
ซึ่งเป็นdash
บน Ubuntu เช่นเดียวกับและksh
bash
อึดอัดเล็กน้อยที่คุณต้องเขียนหลายกรณีทดสอบสำหรับแต่ละคำในcase
งบ แต่พกพา ทำงานร่วมกับกรณีที่คำปรากฏอยู่คนเดียวในบรรทัดในจุดเริ่มต้นจุดสิ้นสุดของบรรทัดหรือตรงกลางของบรรทัดและละเว้นที่มันอาจเป็นส่วนหนึ่งของคำอื่น
#!/bin/sh
line_handler(){
# $1 is line read, prints to stdout
case "$1" in
cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
rat|rat\ *|*\ rat\ *|*\ rat) true;;
*) printf "%s\n" "$1"
esac
}
readlines(){
# $1 is input file, the rest is words we want to remove
inputfile="$1"
shift
while IFS= read -r line;
do
line_handler "$line" "$@"
done < "$inputfile"
[ -n "$line" ] && line_handler "$line"
}
readlines "$@"
และนี่คือวิธีการทำงาน:
$ cat input.txt
the big big fat cat
the cat who likes milk
jumped over gray rat
concat
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt
concat
this is catchy
rational
irrational