在字符串中找到第n个单词的起始位置的最简单方法是什么?单词之间可能有多个空格。
我可以通过字符解析轻松地完成此操作,但我认为使用某些bash命令可能会有更快更简单的方法。
子串中可以有多个相等的单词和单词。
第五个单词的开头:
' the cat ate the bird'
应该导致20(1基础)
答案 0 :(得分:4)
使用awk
非常快:
$ awk '{ print index($0, $2); }' <<<'foo bar baz'
4
这为第二个单词提供了基于1的字符索引。对于第一个单词,将$2
替换为$1
,将$3
替换为第三个,依此类推,或将$NF
替换为最后一个单词。当第n个单词是前面一个单词的子串时要小心。
根据Karakfa的聪明方法进行更新: 如果你的第n个单词是前一个单词的子串,那么你需要更勤奋:
$ cat t
foo bar baz
fobaro bar baz
bar bar baz
$ awk '{ print 1 == index($0, $2) ? 1 : index($0, " "$2)+1; }' < t
4
7
0
$ awk '{ print 1 == index($0, $5) ? 1 : index($0, " "$5)+1; }' <<<' the cat ate the bird'
20
根据KiloOne对功能的需求进行了更新:
function position() {
local n=${1:?For what column do you want position?}
awk "{ print 1 == index(\$0, \$$n) ? 1 : index(\$0, \" \"\$$n)+1; }"
}
$ echo 'my cat ate your bird' | position 3
8
答案 1 :(得分:1)
awk
救援!
如果这是一个xy问题,并且您确实想在找到位置后提取第n个字段,则可以尝试以下操作。例如,对于n = 4。
$ echo "this is a long string with non-uniform spacing" | awk '{print $4}'
long
或
$ echo ... | tr -s ' ' '\t' | cut -f4
long