回答:
grep
アプローチ「cat」または「rat」に一致する行を含まないファイルのコピーを作成するにはgrep
、逆(-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に基づく-特定の文字列を含む行を削除する)
あなたが持つファイルがある場合を検討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