awkコマンドがある場合
pattern { ... }
パターンはキャプチャグループを使用していますが、ブロックでキャプチャされた文字列にアクセスするにはどうすればよいですか?
FS
)を調整して、と一致させるものを選択することができ$field
ます。入力の事前フォーマットも役立ちます。
gawk
(を使用しているためgensub
)。
awkコマンドがある場合
pattern { ... }
パターンはキャプチャグループを使用していますが、ブロックでキャプチャされた文字列にアクセスするにはどうすればよいですか?
FS
)を調整して、と一致させるものを選択することができ$field
ます。入力の事前フォーマットも役立ちます。
gawk
(を使用しているためgensub
)。
回答:
それは思い出の小道でした...
私はずっと前にawkをperlに置き換えました。
どうやら、AWK正規表現エンジンはそのグループをキャプチャしません。
あなたは次のようなものの使用を検討するかもしれません:
perl -n -e'/test(\d+)/ && print $1'
-nフラグを指定すると、awkのようにperlがすべての行をループします。
gawk
!= awk
。これらはさまざまなツールでありgawk
、ほとんどの場所でデフォルトでは使用できません。
gawkでは、match
関数を使用して括弧で囲まれたグループをキャプチャできます。
gawk 'match($0, pattern, ary) {print ary[1]}'
例:
echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}'
出力cd
。
問題の機能を実装するgawkの特定の使用に注意してください。
ポータブルな代替品の場合、match()
およびで同様の結果を得ることができますsubstr
。
例:
echo "abcdef" | awk 'match($0, /b[^e]*/) {print substr($0, RSTART+1, RLENGTH-1)}'
出力cd
。
これは常に必要なものなので、bash関数を作成しました。グレン・ジャックマンの答えに基づいています。
これを.bash_profileなどに追加します。
function regex { gawk 'match($0,/'$1'/, ary) {print ary['${2:-'0'}']}'; }
ファイルの各行の正規表現をキャプチャする
$ cat filename | regex '.*'
ファイルの各行の最初の正規表現キャプチャグループをキャプチャする
$ cat filename | regex '(.*)' 1
grep -o
?
grep -o
キャプチャしたグループを出力できますか?
grep -o
ます。
GNU awkを使用できます。
$ cat hta
RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]
$ gawk 'match($0, /.*(http.*?)\$/, m) { print m[1]; }' < hta
http://www.mysite.net/
awk 'match($0, /.*(http.*?)\$/) { print substr($0,RSTART,RLENGTH) }'
RewriteRule (.*) http://www.mysite.net/$
は私のために印刷されます、それはサブグループ以上のものです。
拡張なしで、バニラawkでのキャプチャーもシミュレートできます。ただし、直感的ではありません。
手順1. gensubを使用して、文字列に表示されない文字で一致を囲みます。ステップ2.文字に対して分割を使用します。ステップ3.分割された配列内の他のすべての要素がキャプチャグループです。
$ echo 'ab cb ad' | awk '{split(gensub(/ a ./、SUBSEP "&" SUBSEP、 "g"、$ 0)、cap、SUBSEP); プリントキャップ[2] "|" キャップ[4]; } ' ab | ad
gensub
がgawk
特定の機能であることはほぼ間違いありません。「awk --version
;-?」と入力すると、awkから何が得られますか。皆さんお元気で。
echo 'ab cb ad' | awk '{gsub(/a./,SUBSEP"&"SUBSEP);split($0,cap,SUBSEP);print cap[2]"|"cap[4]}'
gawk --posix '{gensub(...)}'
。
gensub
機能があるのは間違っていましたが、あなたの例は非常に限られたシナリオに適用されました。パターン全体がグループ化され、パーツkey=(value)
のみを抽出したい場合、それはすべてのようなものに一致することはできませんvalue
。
Peter Tillemansの回答をラップするbash関数を思いつくのに少し苦労しましたが、私が思いついたのは次のとおりです。
function regex {perl -n -e "/ $ 1 / && printf \"%s \ n \ "、" '$ 1'}
"ms"を出力したくないため、次の正規表現引数については、これがopsbのawkベースのbash関数よりもうまく機能することがわかりました。
'([0-9]*)ms$'
$1
'([0-9]*)ms$'
-それは引数として(そして文字列は別の引数として)提供されていますか?そして、からの出力perl -e
がbashのprintf
コマンドに挿入されているので、を置き換えるために%s
、それは正しいですか?おかげで、これを使用したいと思っています。