行から特定の文字列をキャプチャする方法

行から特定の文字列をキャプチャする方法

bash、awk、sed、またはperlを使用して線形コマンドの次の行でsdXのみをキャプチャする方法は?

echo ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data","

期待される出力

sdb
sdc
sdd
sde
sdf

答え1

あなたはそれを使用することができますグレブ議論:

   -P, --perl-regexp
          Interpret the pattern as a Perl-compatible regular expression
          (PCRE).  This is experimental and grep -P may warn of
          unimplemented features.
   -o, --only-matching
          Print only the matched (non-empty) parts of a matching line,
          with each such part on a separate output line.

したがって、あなたのコマンドは次のようになります

echo ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data"," | grep -oP "\w*sd\w*"
sdb
sdc
sdd
sde
sdf

答え2

使用

echo ... | grep -Eo "sd[a-z]"

whereは-Eパターンを(拡張された)正規表現として解釈し、各行の-o一致部分のみを印刷します。

答え3

echo '"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",' 
"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",
echo '"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",' | grep -Po 'sd\w'
sdb
sdc
sdd
sde
sdf

答え4

GNU sed:

$ s='"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",'

$ echo $s| sed -E ':b;s~[^,:]+.{,3}/rid/(.+)~\1~;Te;h;s~(\w+)/.*~\1~p;g;tb;:e d'

関連情報