bash,在单词之间有多个空格的字符串中查找第n个单词的起始位置

时间:2015-12-08 20:48:35

标签: bash

在字符串中找到第n个单词的起始位置的最简单方法是什么?单词之间可能有多个空格。

我可以通过字符解析轻松地完成此操作,但我认为使用某些bash命令可能会有更快更简单的方法。

子串中可以有多个相等的单词和单词。

第五个单词的开头:

' the cat ate  the  bird'

应该导致20(1基础)

2 个答案:

答案 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 

Now available on github as a bashworks module.

答案 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