「cat」と「rat」という単語を含むテキストファイルからすべての行を削除する方法
grep
アプローチ「cat」または「rat」に一致する行のないファイルのコピーを作成するには、grep
を逆に(-v
)使用し、Word全体オプション(-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)
構文と一致しています。
ヒント:ファイルを上書きする前にコマンドの出力をテストするには、-i
演算子なしでsed
を使用します。
( 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
のような他の単語を持ち、見たくない場合を考えます。あなたの出力にあるので、それを行う1つの方法は-
grep -r mouse file_name | grep -vE "(cat|rat)"
/bin/sh
(Ubuntuではdash
、およびksh
、およびbash
で動作します。 case
ステートメントで各Wordに複数のテストケースを記述する必要があるが、移植性があることは少し厄介です。 Wordが行の先頭、行末、または行の途中に単独で表示され、別のWordの一部である可能性がある場所を無視する場合に機能します。
#!/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