こんにちは。たとえば、最初の "_"までの一致の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
または最新のように、現在すべてのボックスにない同じ名前です。-P
freeBSD
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}