与这个问题相关, 列中匹配字符串的列号
我想获取包含某个字符串的列号。
他们没有在下面工作,
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
未定义为正则表达式(虽然对 shell 扩展有效)。
要重用上面的代码,字符串必须用点初始化。
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*
明星想要代表什么。在正则表达式表示法中,星号是示例性字符的“零个或多个”实例。所以Bo*
匹配Boo
,但不匹配Bob
。
我怀疑OP想要Bo
跟随任何字符,并且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