【问题标题】:Nth word in a string variable字符串变量中的第 N 个单词
【发布时间】:2010-06-09 12:10:31
【问题描述】:

在 Bash 中,我想通过变量获取字符串的第 N 个单词。

例如:

STRING="one two three four"
N=3

结果:

"three"

什么 Bash 命令/脚本可以做到这一点?

【问题讨论】:

    标签: bash


    【解决方案1】:
    echo $STRING | cut -d " " -f $N
    

    【讨论】:

    • 在请求不存在的字段时会失败。它不会返回“”,而是返回字符串本身。示例:回声“aaaa” | cut -f2 结果是“aaaa”,而不是空白零长度结果。
    • @ajaaskel 这似乎是在输入中找不到 delimiter 时发生的。现在可以通过使用选项 --only-delimited 来改变这种行为。
    【解决方案2】:

    另一种选择

    N=3
    STRING="one two three four"
    
    arr=($STRING)
    echo ${arr[N-1]}
    

    【讨论】:

    • 为此使用 bash 数组是“最好的”解决方案,我讨厌使用 awk 或 sed,因为我没有看到它们安装在所有设置上,尤其是 msys 设置上。
    • 即使 echo “不是必需的”,我发现它对于理解如何使用 arr 元素很有用。谢谢
    • 如果您已将 IFS(内部字段分隔符)设置为 ':' 或其他内容而不是空格,请在尝试之前将其改回。
    • 这应该是正确的答案。为此目的使用数组既简单又聪明。
    • 请注意,如果 "word" 是 "*" (asterisk),它将失败 - 它会引入当前目录中所有文件和所有目录的列表。
    【解决方案3】:

    使用awk

    echo $STRING | awk -v N=$N '{print $N}'
    

    测试

    % N=3
    % STRING="one two three four"
    % echo $STRING | awk -v N=$N '{print $N}'
    three
    

    【讨论】:

      【解决方案4】:

      包含一些语句的文件:

      cat test.txt
      

      结果:

      This is the 1st Statement
      This is the 2nd Statement
      This is the 3rd Statement
      This is the 4th Statement
      This is the 5th Statement
      

      因此,要打印此语句类型的第 4 个单词:

      awk '{print $4}' test.txt
      

      输出:

      1st
      2nd
      3rd
      4th
      5th
      

      【讨论】:

      • OP 说字符串在变量中,而不是文件中。
      【解决方案5】:

      没有昂贵的分叉,没有管道,没有 bashisms:

      $ set -- $STRING
      $ eval echo \${$N}
      three
      

      或者,如果你想避免eval

      $ set -- $STRING
      $ shift $((N-1))
      $ echo $1
      three
      

      但要注意通配(使用set -f 关闭文件名通配)。

      【讨论】:

      • 它是否处理“*”asterisk 中的“单词”之一? aioobe's answer 没有。
      • @PeterMortensen 两者都可以。在set -f 之后,如果不会全局扩展星号,使用set +f(默认)会。
      【解决方案6】:
      STRING=(one two three four)
      echo "${STRING[n]}"
      

      【讨论】:

      • 在你的例子中,STRING 真的是一个字符串吗?它看起来像一个数组。
      • @NicolasRaoul 是的,实际上你是对的。但我写信是为了替代。
      猜你喜欢
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多