私が書いているスクリプトの一部として、ファイル(単語のリスト)を入力として受け取り、それらの単語のすべてのインスタンスを他の入力ファイルから削除する必要があります。どうすればこのようなことができますか?たぶんgrepを使用していますか?
3 に答える
どうですか
$ grep -v -f words_to_exclude.txt input.txt
どこ
-f
grepを照合する単語のファイルを指定します
-v
一致しないものをgrepに出力させることを指定します
上記では、両方のファイルで1行に1語が必要です。
man grepはこれを言います:
-f FILE、-file=FILEファイルからパターンを1行に1つずつ取得します。空のファイルにはゼロパターンが含まれているため、何にも一致しません。(-fはPOSIXで指定されています。)
この:
-v、-invert-match一致する意味を反転して、一致しない行を選択します。(-vはPOSIXで指定されています。)
したがって、はい、grepを使用するのが良い方法です。少なくとも、入力ファイルから特別な単語を含むすべての行を削除する場合。個々の単語だけを削除したい場合は、事態はさらに複雑になります。
sedはおそらくあなたが探しているものです。スクリプト例:
#! /usr/bin/bash
for word in $(cat $1);
do
sed s/$word//g $2 > tmp;
mv tmp $2;
done;
これをscript.shに保存したとすると、次のように呼び出すことになります。
./script.sh wordsToExclude.txt textToProcess.txt
$1
この場合、bashの「引数番号1」は、wordsToExclude.txt
同様に、$2
textToProcess.txt
これは、$ wordのすべてのインスタンスを何も置き換えないということです。tmpfileは、作業中にソースを破壊しないように、sedが書き込むためのバッファーとして存在します。
sedコマンドのg
は、「グローバル置換フラグ」です。sedのデフォルトの動作は、行内の最初に出現する検索パターンのみを置き換えることです。フラグは、最初のg
オカレンスだけでなく、すべてのオカレンスを置き換えるようにsedに指示します。