2016-08-28 9 views
0

テキストファイルの各行を読み込み、.tstの前に名前を抽出し、各一致を可変配列に格納しようとしています。ここにtxtファイルの例です:bash:txtファイルの各行について、正規表現とマッチして変数配列に保存します。

someTest.tst (/blah/blah/blah), 
    someOtherfile.tst (/some/other/blah), 
    hello.tst (/not/the/same/blah), 
    hi.tst (/is/this/blah), 

文字の前に、各ライン上の空白の束があります。

私は、次の値を抽出し、変数配列に格納したいと思います:私はSEDやawkのが、とのいずれかの私の知識を使って試してみました

someTest 
someOtherfile 
hello 
hi 

は、専門家レベルの状態ではありませんので、私は問題を抱えています私が望むものを達成する。どんな洞察?

答えて

3

これには正規表現はまったく必要ありません。

arr=() 
while read -r name _; do 
    [[ $name = *.tst ]] || continue # skip lines not containing .tst 
    arr+=("${name%.tst}") 
done <input.txt 

declare -p arr # print array contents 
  • read宛先のリストを受け付けます。 (IFSの文字の入力を分割して決定された)フィールドは、読み込まれると変数に取り込まれ、最後の宛先は空白を含む行の残りのすべてのコンテンツを受け取ります。したがって、read -r name _は、最初のフィールドをnameに入れ、残りのすべての内容を_という名前の変数に入れます。
  • [[ $name = *.tst ]] || continueは、最初のフィールドが末尾にないすべての行をスキップします(.tst)。
  • "${name%.tst}"は、"$name"の内容に展開され、接尾辞.tstが存在する場合は削除されます。
  • while read; do ...; done <inputfileパターンの詳細は、BashFAQ #1に記載されています。

しかし、あなたはは、次のようになります正規表現、使用するを望んだ場合:[[ $string =~ $regex ]]を使用して

re='^[[:space:]]*([^[:space:]]+)[.]tst[[:space:]]' 

arr=() 
while IFS= read -r line; do 
    [[ $line =~ $re ]] && arr+=("${BASH_REMATCH[1]}") 
done <input.txt 

declare -p arr # print array contents 

をEREとして$regex評価し、それが一致した場合、全体を置きます一致するコンテンツをBASH_REMATCH[0]に、一致グループをBASH_REMATCH[1]以降に設定します。

+0

ありがとうございました。これは本当に助けになった! – john

関連する問題