回答:
2つのこと:
-o
ように、オプションが必要なので、(行全体ではなく)一致のみが出力されます-P
などの便利な要素を含むPerlの正規表現を使用するオプションが必要です。 (?= )
(?<= )
parensis内の部分のみを一致させたい場合:
grep -oP '(?<=\/\()\w(?=\).+\/)' myfile.txt
ファイルにスティングが含まれている場合/(a)5667/
、grepは「a」を出力します。理由は次のとおりです。
/(
によって発見されます\/\(
が、それらは後読みされ (?<= )
ているため、報告されませんa
マッチングされ\w
、したがって、(のために印刷されています-o
))5667/
b <が見つかりました\).+\/
が、先読みされ (?= )
ているため報告されませんかっこ内のものだけが必要な場合は、サブマッチのキャプチャをサポートするもの(名前付きまたは番号付きキャプチャグループ)が必要です。grepやegrepでこれができるとは思わない、perlやsedでできる。たとえば、perlの場合:
fooというファイルに次のような行がある場合:
/adsdds /
あなたがやる:
perl -nle 'print $1 if /\/(\w).+\//' foo
文字aが返されます。それはあなたが望むものではないかもしれません。何を一致させようとしているのかを教えていただければ、より良い助けが得られるかもしれません。$ 1は、括弧の最初のセットでキャプチャされたものです。2ドルが2番目のセットなどになります。
シェルに加えてbashとして質問にタグを付けたため、grepの横に別の解決策があります。
Bashには、バージョン3.0以降、=~
Perlと同様に演算子を使用する独自の正規表現エンジンがあります。
今、次のコードを与えられます:
#!/bin/bash
DATA="test <Lane>8</Lane>"
if [[ "$DATA" =~ \<Lane\>([[:digit:]]+)\<\/Lane\> ]]; then
echo $BASH_REMATCH
echo ${BASH_REMATCH[1]}
fi
bash
だけsh
でなく、として起動する必要があることに注意してください$BASH_REMATCH
正規表現全体と一致する文字列全体を提供するため、 <Lane>8</Lane>
${BASH_REMATCH[1]}
1番目のグループに一致する部分を与えるので、 8
>
によって出力された、XMLとFASTAデータ(両方ともまったく異なる目的にシンボルを使用)の恐ろしい組み合わせを解析しています。もちろん、どちらの形式もエスケープせずにインターレースで吐き出されます。したがって、これに標準のXMLライブラリをスローすることは不可能です。また、コードのこの時点でBash正規表現を使用しているのは、2、3のデータを抽出するだけで済み、この混乱のために専用のパーサーを作成するよりも2正規表現の方がはるかに優れているからです。#LifeInBioinformatics
ファイルに以下が含まれていると仮定します。
$ cat file
Text-here>xyz</more text
また、>
との間の文字が必要な</
場合は、次のいずれかを使用できます。
grep grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl perl -nle 'print $1 if />(\w+)<\//' file
すべてが文字列「xyz」を出力します。
この行の数字をキャプチャする場合:
$ cat file
Text-<here>1234</text>-ends
grep grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl perl -nle 'print $1 if />([0-9]+)<\//' file
これはあなたが要求していることを達成しますが、私はそれがあなたが本当に望んでいるとは思いません。.*
正規表現の前にを置いて、マッチの前に何かを食べますが、それは貪欲な操作なので、これ\w
は文字列の最後から2番目の文字にのみ一致します。
括弧とをエスケープする必要があることに注意してください+
。
sed 's/.*\(\w\).\+/\1/' myfile.txt
sed
を行うために後方参照で何回取り組んだか考えていますか?