1

私が書いているスクリプトの一部として、ファイル(単語のリスト)を入力として受け取り、それらの単語のすべてのインスタンスを他の入力ファイルから削除する必要があります。どうすればこのようなことができますか?たぶんを使用していますか?

4

3 に答える 3

3

どうですか

$ grep -v -f words_to_exclude.txt input.txt

どこ

-fgrepを照合する単語のファイルを指定します

-v一致しないものをgrepに出力させることを指定します

上記では、両方のファイルで1行に1語が必要です。

于 2013-03-18T16:55:22.120 に答える
1

man grepはこれを言います:

-f FILE、-file=FILEファイルからパターンを1行に1つずつ取得します。空のファイルにはゼロパターンが含まれているため、何にも一致しません。(-fはPOSIXで指定されています。)

この:

-v、-invert-match一致する意味を反転して、一致しない行を選択します。(-vはPOSIXで指定されています。)

したがって、はい、grepを使用するのが良い方法です。少なくとも、入力ファイルから特別な単語を含むすべての行を削除する場合。個々の単語だけを削除したい場合は、事態はさらに複雑になります。

于 2013-03-18T16:57:22.117 に答える
0

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同様に、$2textToProcess.txt

これは、$ wordのすべてのインスタンスを何も置き換えないということです。tmpfileは、作業中にソースを破壊しないように、sedが書き込むためのバッファーとして存在します。

sedコマンドのgは、「グローバル置換フラグ」です。sedのデフォルトの動作は、行内の最初に出現する検索パターンのみを置き換えることです。フラグは、最初のgオカレンスだけでなく、すべてのオカレンスを置き換えるようにsedに指示します。

于 2013-03-18T16:58:34.067 に答える