これは行番号を返しますが、文字列にあります。
grep -n -F -w $word $file | cut -d : -f 1
答え1
私はandのawk
代わりにこれを使います。行番号を配列に入れるには、次のようにします。grep
cut
プロセスの交換とbashの組み込み(mapfile
in bashの同義語はbashで実行するとbashよりも優れており、詳細なヘルプを得ることができます)。たとえば、mapfile
readarray
help mapfile
help readarray
mapfile -t array < <(awk -v w="$word" '$0 ~ w {print NR}' "$file")
または、正規表現マッチングの代わりに固定文字列マッチングを使用します。
mapfile -t array < <(awk -v w="$word" 'index($0,w) {print NR}' "$file")
どちらも$word
awk のオプションを介して awk 変数にシェル変数を渡すので、含まれる文字列は何でも安全です。二重引用符で囲まれたawkスクリプトで$ wordを使用するよりもはるかに安全です。w
-v
FNR
注:入力ファイルが複数ある場合は、代わりに印刷できますNR
。 NRは、これまで読んだすべての行の累積合計です。 FNRは行番号です。現在のファイルただ。 (私が「行」と言うとき、実際には「レコード」を意味します。なぜなら、awkは改行で区切られたレコードを含むプレーンテキストファイル以上を処理できるからです。)
答え2
bash
行の内容を配列として読み取るには、次のものを使用できますreadarray -t
。mapfile
マッピングそしていいえ文書zsh/mapfile
これにより、モジュールzsh
とその$mapfile
特殊な連想配列(実際のマップファイル)との混乱が発生します。
readarray -t array < <(
grep -nFwe "$word" -- "$file" | cut -d : -f 1
)
--
(ところで、その周りにおよび/または引用符を拡張することを忘れました-e
。)
あるいは、Split + glob演算子を使用することができ、すべてが数値であるため、glob無効をスキップできます。
IFS=$'\n'
array=( $(grep -nFwe "$word" -- "$file" | cut -d : -f 1) )
これの利点は、パイプの終了状態が保存されることです。
zshでは、パラメータ拡張フラグを使用して、変更なしでf
オンラインeedを分割できます。f
$IFS
array=( ${(f)"$(grep -nFwe "$word" -- "$file" | cut -d : -f 1)" } )
ただし、ここではデフォルト値を使用することもできます(zshではこれを変更する$IFS
理由はありません)。$IFS
array=( $(grep -nFwe "$word" -- "$file" | cut -d : -f 1) )