2012-03-25 15 views
0

ファイルを読み込み、パイプでgrep文を作成して-vフラグを使用してこれらのパターンを削除する必要があります。つまり、ファイルがあります。例えば、以下のパターンが含まれていnegativelist、:シェルスクリプトでアスタリスクやその他の特殊文字をエスケープする

Hello 
World 
Java 

はこのように、私はラインでこのファイルの行を読んで、次のようにサンプルファイルからこれらのパターンを除去するためにパイプされたgrepのステートメントを構築、のgrep

inputfileに-v "Hello" inputfile | grep -v "World" | grep -v "Java"

しかし、私はネガティヴリストに特殊文字を宣言している間に問題に直面しています。通常はgrep -v '*' 入力ファイルを使用して、アスタリスクを含むすべての行を削除しますが、この作業を行うことはできません。 ネガティヴリストでアスタリスクを一重引用符で囲んでエスケープしても、役に立たないようです。アスタリスクをエスケープして、それを含む行を消すことができるようにするための考え方、どの行を囲む私の現在のアプローチを使用して否定リストから二重引用符を読み取るか?

  • grepをパイプ文字列は次の形式でスクリプトによって構築されています:

    は、私は、制約の次のセットを持って、明確にする はgrep -v "LINE1 negativelistから"入力ファイル| grepの-v negativelistから「LINE2 ...とそう
  • 上さらに、このスクリプトは、このgrepコマンドを実行し、別のファイルにその出力を格納します。
  • 私だけで、二重引用符の間に何が起こるのかを制御することができます「*」コマンドラインから入力ファイル。私はスクリプトが
  • がさえ、私はgrepのを実行することにより、所望の出力を得ると思ったこれらのパイプのgrep文を生成する方法を変更することはできませんnegativelistのパターンを定義する、単純に*保存negativelistは、aを含むすべての行を削除するという望ましい結果をもたらさないそれらにsterisk。また
  • 、例えばハローなどのパターンを定義する。*世界形態

    Hellotest1Worldのすべての行を除去する、または

    Hellotest2World

negativelistで定義された」doesnのアスタリスクが正しくエスケープされない可能性があります。コマンドラインで次の文は、正しく動作します。grep -v「こんにちは*世界」 inputfile解説、それは正しくこんにちは含むすべての行は、あなたがすべき世界

答えて

2

が続く間に任意の文字(複数可)に続いてなくなりすなわちgrepの代わりにfgrepを使用します。これは、何も展開せずに完全一致を実行します。

例:

$ cat /tmp/a 
aaa 
zzz 
eee 
*** 
rrr 
ttt 
yyy 

$ fgrep -v -e 'aaa' -e '*' -e zzz -e yyy /tmp/a 
eee 
rrr 
ttt 
+0

その提案をお寄せいただきありがとうございます。これらのパイプ文を構築するスクリプトが私が制御するものではないので、私はfgrepを使うことができないと仮定して、他の提案はありますか? – Rishabh

+0

投稿が編集されました。あなたは何をコントロールしていますか? 'grep'もこのように使うことができます:' grep '\ *' ' –

+0

パイプでgrep文を生成するスクリプトは、実際に* negativelist *から各行を二重引用符で囲みます。この制約を受けて* negativelist *にアスタリスクをどのように宣言しなければならないか考えてみませんか? – Rishabh

関連する問題