字符串变量中的第N个字


85

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

例如:

STRING="one two three four"
N=3

结果:

"three"

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

Answers:


95
echo $STRING | cut -d " " -f $N

3
请求不存在的字段时,cut将失败。而不是返回“”,而是将返回字符串本身。示例:echo“ aaaa” | cut -f2结果为“ aaaa”,而不是空白的零长度结果。
ajaaskel '18

@ajaaskel似乎在输入中找不到分隔符时发生。如今,可以通过使用--only-delimited选项更改该行为。
Samuli Pahaoja

64

替代

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
为此,使用bash数组是“最佳”解决方案,我不喜欢使用awk或sed,因为我看不到它们都安装在所有设置中,尤其是msys设置。
Sundar,2015年

1
即使回声“不是必需的”,我发现它对于理解如何使用arr元素也很有用。感谢
Chen Li Yong

1
如果已将IFS(内部字段分隔符)设置为':'或其他内容(而不是空格),请在尝试此操作之前将其更改回去。
Noumenon

1
这应该是正确的答案。为此目的使用数组既简单又聪明。
ajaaskel '18

31

使用 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

9

一个包含一些语句的文件:

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

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

cat test.txt |awk '{print $4}'

输出:

1st
2nd
3rd
4th
5th

2
OP表示该字符串位于变量中,而不是文件中。
codeforester

3

没有昂贵的叉子,没有管道,没有洗礼:

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

但是要当心。


2
STRING=(one two three four)
echo "${STRING[n]}"

2
在您的示例中,STRING真的是字符串吗?它看起来像一个数组。
Nicolas Raoul

@NicolasRaoul是的,实际上您是对的。但我写的是替代品。
mnrl 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.