2016-07-11 6 views
0

長い文字列変数から最初の '文字列'の行番号を表示し、結果を他の変数に設定しようとしています。 コマンドの結果を変数に設定するには

は、最初の行を表示するには「という文字列を」私が使用して出現:

grep -n -m 1 String Filename.csv |cut -f1 -d: 

それが正常に動作しますしかし、私が取得したいと思います。 『長い文字列に配列変数とFilename.csvスイッチから文字列』の値をため。例:

string[0]='Column2' 

Query="Select Column1, 
       Column2, 
       Column3 
     From dual" 

そして今:

Line_number=$(grep -n -m 1 ${string[0]} "$Query" |cut -f1 -d:) 
echo $Line_number 

結果は次のようになります。2

ないこと表示: はgrep:「列1を選択し、 列2、 COLUMN3 デュアルから」そのようなファイルやディレクトリはありません 間違っているのですか?

+0

追加 ''(grep -n -m 1 $ {string [0]} "$ query" | cut -f1 -d:) '? – sjsam

+0

コンテンツを読み込もうとしていますクエリのファイル名として、 '<<<" $ Query "' – 123

答えて

0

変更スクリプトへ:

string[0]='Column2' 

Query="Select Column1,\n 
       Column2,\n 
       Column3\n 
     From dual" 

Line_number=$(echo $Query | grep -n -m 1 ${string[0]} |cut -f1 -d:) 
echo $Line_number 

とあなたが得るものを参照してください。このため

+0

を使用してください。 – 123

+0

こんにちは、エラーはありませんが、結果は常に1つ(すべて1行にあるようです)です。無効な文字(データベースから)でエラーが発生しました – maciek2791

+0

@ maciek2791 grepは "grep $ pattern $ Query"のようにgrepを使用しないでください。ここで、Queryはファイル名ではなく文字列で、 "echo $ Query | grep $ pattern"のみが使用できます。 '' 'grep'''で詳細を見ることができます。 –

0

awkのソリューションは次のようになります。

arr=$(echo "${string[@]}") 
line_number=$(awk -v var="$arr" '$0 ~ var{print NR;exit 0}' <<<"$Query") 
echo "$line_number" 

ここで何が起こっていますか?

  • 我々は直接awkにbashの配列を渡すことはできませんので、我々はechoはそれを編とarrでそれを保存。
  • var="$arr"は、シェル変数をawk変数varに保存します。
  • $0 ~ var{print NR;exit 0}パターンのチェック(〜)は、最初の発生の行番号を出力し、スクリプトを終了します。
  • <<<は、文字列をコマンドに渡すのに役立つherestringと呼ばれます。このため

SEDソリューションは、次のようになります。

arr=$(echo "${string[@]}") 
line_number=$(sed -n "/$arr/{=;q}" <<<"$Query") 
echo "$line_number" 

ここで何が起こっていますか?

  • 我々は直接sedにbashの配列を渡すことはできませんので、我々はechoはそれを編とarrでそれを保存。
  • -nオプションは、通常の出力を抑制します。
  • /$arr/{=;q}は、パターン(/stuff/)を確認し、行番号(=)を出力してから終了します。
関連する問題