2017-05-31 4 views
1

私はstring.Iを保存する変数は、この変数はfile.txtを中に存在しているかいないパターンとファイルの両方に行間と行間の数が異なるファイルでパターンを見つける方法はありますか?

これは私のfile.txtはあるかどうかを見つける方法をここに

var='this is 
    my 
      name' 

を最悪のケースを取っています持っています私は

if grep -Fwq "$var" file.txt 
    then 
    echo "Duplicate" 
    fi 

BUを試してみましたが、何

hi all 
    this 
      is my 
       name 
    but no one likes it 

echo "$var1" 
this is 
    my 
      name 

cat file.txt 
hi all 
    this 
      is my 
       name 
    but no one likes it 

:varとfile.txtを両方が

+2

すべての空白(スペース、タブ、改行など)を変数と入力ファイルの両方の単一スペースに変換して比較しますか? – Sundeep

+0

ファイルが大きくて空き領域を削除することはできますが、すべての改行を削除することはできません。 –

+2

@ j.doeなぜ、空白を削除するのが改行を削除するよりも安価だと思いますか? – 123

答えて

1

共通スペースや改行形式を持っているだけで、この作品は + グレップアプローチをsedはtをPAの準備ttern

p=$(sed -zE 's/[[:space:]]+/[[:space:]]*/g' <<< "$var1") 

if grep -wzq "$p" file.txt; then echo "Duplicate"; fi 
Duplicate 

  • sed -zE 's/[[:space:]]+/[[:space:]]*/g' - さらにgrepコマンドで使用するためのPOSIX文字クラスとして各空間を表す(複数の空白は単一のものに絞った)

  • -z - 入力データと出力データをsラインのequences、GNU AWKでは代わりに改行のゼロバイト(ASCII NUL文字)で終了し、各

+1

これは 'name'とちょうど一致します – 123

+1

@RomanPerekhrestあなたはなぜ私に返信したのか分かりませんが、質問を読んだら、' var'の文字列全体とマッチさせたい、これは 'name'という単一行にマッチし、' this は私のファイルであり、それでも一致します。 – 123

+0

入力にNUL文字が含まれていないと仮定したYMMV。テキストファイルでのそれらの存在は、awk -v RS = '\ 0' 'が一度にファイル全体を読む強力な方法ではなく、' awk -v RS = '^ $' 'が代わりに使用される理由です)。あなたは 'sed '/ @/@ A/gを行うことができます。問題を回避するためにgrepを実行する前に、入力ファイルと変数の両方で/ s/\ 0/@ B/g " –

0

マルチchar型のRSのための(と私はまた、I以来、簡潔にするため\s代わりの[[:space:]]を使用しています)とにかくのgawkを使用してM」:

$ awk -v RS="$var" 'BEGIN{gsub(/\s+/,"\\s+",RS)} END{if (NR>1) print "Duplicate"}' file 
Duplicate 

上記リテラル文字にvarでエスケープシーケンスを変換します(たとえば、 \t - >タブ文字、\n - >改行文字)RSを使用する前に、それは望ましくないです場合は、RS使用して設定します。代わりに-vでそれを設定するので

$ var="$var" awk 'BEGIN{RS=ENVIRON["var"]; ... 

を。

関連する問題