Yanıtlar:
grep
yaklaşmak, yanaşmak, yaklaşımDosyanın "cat" veya "rat" ile eşleşen çizgileri olmayan bir kopyasını oluşturmak için grep
, reverse ( -v
) biçiminde ve bütün sözcük seçeneği ( -w
) ile kullanabilirsiniz.
grep -vwE "(cat|rat)" sourcefile > destinationfile
Tam kelime seçeneği Eşleşmeyecek emin olur cats
ya grateful
mesela. Kabuğunuzun çıktı yönlendirmesi ( >
) yeni bir dosyaya yazmak için kullanılır . Sözdizimi -E
için genişletilmiş normal ifadeleri etkinleştirme seçeneğine ihtiyacımız var (one|other)
.
sed
yaklaşmak, yanaşmak, yaklaşımAlternatif olarak, hatları yerinde kaldırmak için kullanabilirsiniz sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
\b
Setleri kelime sınırları ve d
operasyon öne eğik çizgiler arasında ifade ile eşleşen çizgiyi siler. cat
ve rat
her ikisi de (one|other)
görünüşte ters eğik çizgi ile kaçmamız gereken sözdizimiyle eşleştiriliyor .
İpucu: Dosyanın üzerine yazmadan önce komutun çıktısını test etmek sed
için -i
operatör olmadan kullanın .
Sadece terminalde test etmek için şunları kullanın:
sed '/[cr]at/d' file_name
Bu satırları dosyadan gerçekten kaldırmak için, şunu kullanın:
sed -i '/[cr]at/d' file_name
Dosyanız varsa file_name
ve fareyi aramak istiyorsanız, ancak aynı zamanda fareden birkaç satır gibi başka sözcükleri de içeren cat
ve rat
çıktınızdakileri görmek istemiyorsanız, bunu yapmanın tek yolu -
grep -r mouse file_name | grep -vE "(cat|rat)"
Çalışıyor /bin/sh
olan dash
yanısıra, Ubuntu'da ksh
ve bash
. Tuhaf case
ama ifadede her kelime için birden fazla test senaryosu yazmanız biraz garip . Kelimenin satırda, başında, satırın sonunda veya satırın ortasında tek başına göründüğü durumlarla çalışır ve başka bir kelimenin neresinde olabileceğini yoksayar.
#!/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 "$@"
Ve bu nasıl çalışır:
$ 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