

Solaris上でシェルスクリプト（bash）にて、CSV形式ファイルから取得した1行毎の文字列の中から、特定の文字列のイコールの後ろのカンマ前までの文字列を抜き取りたいのですが、正規表現の書き方が解りません。どうかご教授いただけますでしょうか。

（例）  
a=aaa,b=bbb,c=ccc,d=ddd,e=eee  
a=aaa,c=ccc,d=ddd,e=eee,f=fff  
b=bbb,c=ccc,d=ddd,e=eee,g=ggg  
：

上記の例で、"d="の後ろの”ddd"を取得したいです。  
"d="は必須項目なのですが、"a="や"b="は必須ではない為、  
データが無い場合もあり、"d="の出現順序は固定ではありません。


CC BY-SA 3.0
2016-06-04T07:14:59.643
25436
2016-06-07T01:59:37.660
2016-06-06T22:28:54.070
15752
15752
question
bash shellscript solaris
シェルスクリプトで特定の文字列のイコールの後ろの文字列を取得


bash の built-in command だけを使うのであれば以下の様に、

[code]

    $ while IFS=, read -ra l
      do
        for((i=0;i<${#l[@]};i++))
        do
          [[ ${l[$i]} =~ ^d=.+ ]] && printf '%s\n' "${l[$i]#d=}"
        done
      done < data.csv
    
[/code]

GNU grep を使っても良いのであれば以下の様にもできます。

[code]

    $ grep -Po '((?<=,d=)|(?<=^d=))(.+?)(?=(,|$))' data.csv
    
[/code]

ただ、どちらとも d の値が無い場合(以下の様な行)は何も出力しません。

[code]

    a=aaa,b=bbb,c=ccc,d=,e=eee
    
[/code]

**追記**

Solaris + sed との事ですが、tr コマンドと組み合わせて以下の様にしてみると良いかもしれません。

[code]

    $ tr , '\n' < data.csv | sed -n 's/^d=//p'
    
[/code]

なお、手元に Solaris 環境がないため結果については未確認です。


CC BY-SA 3.0
2016-06-04T08:52:11.340
25439
2016-06-07T01:59:37.660
2016-06-07T01:59:37.660
25436
answer


自分が実際にやるなら、てっとり早くこんな感じで処理すると思います。

[code]

    $ grep -o 'd=[^,]*' in.csv | sed -e 's/^d=//'
    
[/code]


CC BY-SA 3.0
2016-06-04T13:30:53.570
25445
2016-06-04T13:30:53.570
4010
25436
answer


sed なら  
`  
sed -n 's/^.*d=\([^,]\+\).*$/\1/p'  
`  
「d=」が無い行は無視されます。


CC BY-SA 3.0
2016-06-04T16:15:02.843
25450
2016-06-04T16:15:02.843
4603
25436
answer