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

标签 bash

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

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

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

其中第 5 个单词的开头:

' 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 

Now available on github as a bashworks module.

关于bash,查找单词之间有多个空格的字符串中第n个单词的起始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165746/

相关文章:

bash - 如何快速检查私有(private) rsa key 是否仍然适用于 bash 中的一堆服务器?

Bash glob 参数只显示第一个文件而不是所有文件

r - 在 Windows 上的 RMarkdown 中执行 bash (Git-Bash)

linux - Bash脚本根据名称将所有文件从当前目录传输到特定目录

bash - 如何在 Thoughtworks Go 任务命令中解析环境变量

linux - 在终端中查看命令行表达式的实时结果?

mysql - 为什么 mysql 通过 ssh 命令不提示输入密码?

bash - 在 psql 命令中插入 bash 变量

windows - Windows 中文件夹的 Shell 快捷方式

bash - 两个文件夹中的差异文件忽略第一行