2015-12-08 53 views
2

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

我可以很容易地通过字符解析来完成这个任务,但我认为可能会有一些更快更简单的方法来使用一些bash命令。

子字符串中可以有多个相同的单词和单词。

五号字在这段开始:

' the cat ate the bird' 

应导致20(1型)

+0

http://xyproblem.info/ –

+0

你能解释为什么这是一个xyproblem。我的主题标题实际上是这样说的,你必须假定由于没有指定单词的格式,那么它们可以是任何东西,包括重复和子串。 – KiloOne

+1

@KiloOne它是X/Y,因为您要求算法没有算法解决问题的上下文。 – bishop

回答

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.

+0

的位置尝试“foobar bar baz”作为输入。 – karakfa

+0

当第n个单词是其中一个前进单词*的子串时会发生什么? –

+0

@karakfa是的,我知道。这就是为什么我写了“当第n个词是其中一个处理词的子串时要小心。“ – bishop

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 
+1

我希望第n个字段 – KiloOne

相关问题