この質問に関して、 文字列に一致する列の列番号
特定の文字列を含む列番号を取得したいです。
彼らはその下で働かなかった。
string=Bo*
echo 'Hi Boo Jiggy' | awk -v b="$string" '{for (i=1;i<=NF;i++) { if ($i == b) { print i } }}'
...でもない
string=*oo
echo 'Hi Boo Jiggy' | awk -v b="$string" '{for (i=1;i<=NF;i++) { if ($i == b) { print i } }}'
どんな提案がありますか?よろしくお願いします!
答え1
~
代わりに正規表現のような一致のために==
string=Bo*
echo 'Hi Boo Jiggy' |
awk -v b="$string" '{for (i=1;i<=NF;i++) { if ($i ~ b) { print i } }}'
出力
2
コメントで述べたように、*oo
正規表現として定義されていません(シェル拡張には有効ですが)。
上記のコードを再利用するには、文字列をドットで初期化する必要があります。
string=.*oo
答え2
使用幸せ(以前のPerl_6)
または
~$ echo "Hi Boo Jiggy Boo" | raku -ne 'put .words.grep(/Bo./, :k)'
1 3
または
~$ echo "Hi Boo Jiggy Boo" | raku -ne 'my regex R { Bo. }; put .words.grep(/<R>/, :k)'
1 3
または
~$ echo "Hi Boo Jiggy Boo" | env string="Bo." raku -ne 'put .words.grep(/<{ %*ENV<string> }>/, :k)'
1 3
@Ed_Mortonが彼のコメントで指摘したように、*
OPスターが何を表現したいのか完全には明確ではありません。正規表現の表記では、アスタリスクは、例の文字の「0個以上」のインスタンスです。したがって、一致がBo*
一致Boo
しませんBob
。
Bo
OPがフォローしたいと思います。どの文字でBo.
正規表現の表記法を使用します。違いを示すために、次の例はigg*
正規表現の一致と一致の違いを示していますigg.
。
~$ echo "Hi Boo Jiggy Boo" | raku -ne 'say .words.match(/igg*/)'
「igg」
~$ echo "Hi Boo Jiggy Boo" | raku -ne 'say .words.match(/igg./)'
「iggy」
~$ echo "Hi Boo Jiggy Boo" | raku -ne 'my regex R { igg* }; say .words.match(/<R>/)'
「igg」
R => 「igg」
~$ echo "Hi Boo Jiggy Boo" | raku -ne 'my regex R { igg. }; say .words.match(/<R>/)'
「iggy」
R => 「iggy」
~$ echo "Hi Boo Jiggy Boo" | env string="igg*" raku -ne 'say .words.match(/<{ %*ENV<string> }>/)'
「igg」
~$ echo "Hi Boo Jiggy Boo" | env string="igg." raku -ne 'say .words.match(/<{ %*ENV<string> }>/)'
「iggy」
より多くの例については、下記のURLをご覧ください。
https://unix.stackexchange.com/a/711393/227738
https://raku.org