web-dev-qa-db-ja.com

端末を介して特定の単語を含むテキストファイルから行を削除する方法

「cat」と「rat」という単語を含むテキストファイルからすべての行を削除する方法

70
PersonX

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操作はスラッシュ間の式に一致する行を削除します。 catratは両方とも、明らかにバックスラッシュでエスケープする必要がある(one|other)構文と一致しています。

ヒント:ファイルを上書きする前にコマンドの出力をテストするには、-i演算子なしでsedを使用します。

Sed-特定の文字列を含む行を削除する に基づく)

95
gertvdijk

ターミナルのみでテストするには、次を使用します。

sed '/[cr]at/d' file_name

これらの行を実際にファイルから削除するには、次を使用します。

sed -i '/[cr]at/d' file_name
15
Radu Rădeanu

Vim-wayを試してください:

ex +"g/[cr]at/d" -scwq file.txt
5
kenorb

file_nameのファイルがあり、マウスを検索したいが、同時にマウスからの行がcatratのような他の単語を持ち、見たくない場合を考えます。あなたの出力にあるので、それを行う1つの方法は-

grep -r mouse file_name | grep -vE "(cat|rat)"
0
Indrajeet Gour

ポータブルシェルウェイ

/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
0