查找字符串中第n个单词的起始位置最简单的方法是什么?可能在单词之间有多个空格。bash,在单词间有多个空格的字符串中找到第n个单词的起始位置
我可以很容易地通过字符解析来完成这个任务,但我认为可能会有一些更快更简单的方法来使用一些bash命令。
子字符串中可以有多个相同的单词和单词。
五号字在这段开始:
' the cat ate the bird'
应导致20(1型)
查找字符串中第n个单词的起始位置最简单的方法是什么?可能在单词之间有多个空格。bash,在单词间有多个空格的字符串中找到第n个单词的起始位置
我可以很容易地通过字符解析来完成这个任务,但我认为可能会有一些更快更简单的方法来使用一些bash命令。
子字符串中可以有多个相同的单词和单词。
五号字在这段开始:
' the cat ate the bird'
应导致20(1型)
使用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
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
我希望第n个字段 – KiloOne
http://xyproblem.info/ –
你能解释为什么这是一个xyproblem。我的主题标题实际上是这样说的,你必须假定由于没有指定单词的格式,那么它们可以是任何东西,包括重复和子串。 – KiloOne
@KiloOne它是X/Y,因为您要求算法没有算法解决问题的上下文。 – bishop