Bagaimana cara menghapus semua baris dari file teks yang mengandung kata "cat" dan "rat"?
Bagaimana cara menghapus semua baris dari file teks yang mengandung kata "cat" dan "rat"?
Jawaban:
grep
pendekatanUntuk membuat salinan file tanpa baris yang cocok dengan "cat" atau "rat", orang dapat menggunakan grep
secara terbalik ( -v
) dan dengan opsi seluruh kata ( -w
).
grep -vwE "(cat|rat)" sourcefile > destinationfile
Opsi seluruh kata memastikan itu tidak akan cocok cats
atau grateful
misalnya. Redirection output dari shell Anda digunakan ( >
) untuk menulisnya ke file baru. Kami membutuhkan -E
opsi untuk mengaktifkan ekspresi reguler yang diperluas untuk (one|other)
sintaks.
sed
pendekatanAtau, untuk menghapus garis di tempat yang bisa digunakan sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
The \b
batas set kata dan d
operasi menghapus garis yang cocok dengan ekspresi antara garis miring ke depan. cat
dan rat
keduanya dicocokkan dengan (one|other)
sintaks yang tampaknya perlu kita hindari dengan garis miring terbalik.
Tip: gunakan sed
tanpa -i
operator untuk menguji output dari perintah sebelum menimpa file.
(Berdasarkan Sed - Hapus baris yang berisi string tertentu )
Untuk menguji di terminal saja, gunakan:
sed '/[cr]at/d' file_name
Untuk benar-benar menghapus garis-garis itu dari file, gunakan:
sed -i '/[cr]at/d' file_name
Pertimbangkan jika Anda memiliki file dengan file_name
dan Anda ingin mencari mouse tetapi pada saat yang sama beberapa baris dari mouse memiliki kata-kata lain seperti cat
dan rat
dan Anda tidak ingin melihat orang-orang di output Anda, jadi satu-satunya cara untuk melakukannya adalah -
grep -r mouse file_name | grep -vE "(cat|rat)"
Bekerja di /bin/sh
, yang ada dash
di Ubuntu, serta ksh
, dan bash
. Sedikit canggung bahwa Anda harus menulis beberapa test case untuk setiap kata dalam case
pernyataan tetapi portabel. Bekerja dengan kasus di mana kata muncul sendiri di telepon, di awal, di akhir baris, atau di tengah kalimat, dan mengabaikan di mana kata itu mungkin menjadi bagian dari kata lain.
#!/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 "$@"
Dan ini cara kerjanya:
$ 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