一致するgrep文字列から特定のコンポーネントを返しますか?

一致するgrep文字列から特定のコンポーネントを返しますか?

こんにちは。たとえば、最初の "_"までの一致の1つのコンポーネントのみを抽出したいと思います。

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -P -o '^H.+?_'

しかし、上記の内容は返されますが、Ha00030_私はほしいだけです。Ha00030

一致の特定の部分だけが欲しいことをgrepに示すために私ができること(括弧など)はありますか?

編集:^ Hは必要ありません。したがって、最初の「_」だけを一致させるだけで十分です。

答え1

このようにしてください文字クラスを除外:

$ echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -Po '^[^_]+'
Ha00030

PCREまたは最新のように、現在すべてのボックスにない同じ名前です。-PfreeBSD

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -o '^[^_]\+'

[^_]+以下を除いて、数量子がある_すべてを意味します。+

使用

使用パラメータ拡張の置き換え、望むより:http://mywiki.wooledge.org/BashFAQ/073との「パラメータ拡張」man bash。また見てくださいhttp://wiki.bash-hackers.org/syntax/pe

$ str=Ha00030_Z6_L008_I1_001.fastq.gz
$ echo "${str//_*/}"
Ha00030

または

$ IFS=_ read str _ <<< "Ha00030_Z6_L008_I1_001.fastq.gz"
$ echo "$str"
Ha00030

使用cut(すべてのシェル)

POSIXライ

$ printf '%s\n' "Ha00030_Z6_L008_I1_001.fastq.gz" | cut -d'_' -f1
Ha00030

答え2

文字列を取得する場所に応じて、シェルを離れることなくフィールドを抽出できます。

a="Ha00030_Z6_L008_I1_001.fastq.gz"
echo "${a%%_*}"

出力

Ha00030

答え3

awk特にロジックがより複雑になる可能性がある場合は、これを考慮することもできます。

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | awk -F_ '{print $1}' 

-F_最初の項目を分割し_て印刷することを意味します。{print $1}

関連情報