一致する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

おすすめ記事