如何在bash中拆分单词

时间:2015-03-27 20:29:59

标签: linux bash ubuntu

晚上好,人们

目前我有一个名为inputArray的数组,它将输入文件逐行存储7行。我有一个单词70000($s0),如何将单词拆分为70000& ($ s0)分开?

我看了一下这个网站上的答案,但我无法理解,我看到的答案是:

s='1000($s3)'
IFS='()' read a b <<< "$s"
echo -e "a=<$a>\nb=<$b>"

给出输出a=<1000> b=<$s3>

1 个答案:

答案 0 :(得分:1)

让我试一试。

在某些情况下,shell将执行“单词拆分”,其中一串文本被分解为单词。单词边界由IFS变量定义。 IFS的默认值为:space,tab,newline。当要将字符串拆分为单词时,将删除此字符集的任何序列以提取单词。

在您的示例中,分隔单词的字符集为()。因此,该字符串中由IFS字符集限定的单词为1000$s3

什么是<<< "$s"?这是一个here-string。它用于将字符串发送到某个命令的标准输入。这就像在做

echo "$s" | read a b

除了表单在bash中没有按预期工作。 read a b <<< "$s"效果很好。

现在,分词发生的情况是什么?一个是变量是不加引号的。演示:

IFS='()'
echo "$s" | wc    # 1 line, 1 word and 10 characters
echo $s | wc      # 1 line, 2 words and 9 characters

read命令还将字符串拆分为单词,以便将单词分配给命名变量。变量a获得第一个单词,b获得所有其余单词。

命令分解为:

  IFS='()' read a b <<< "$s"
# ^^^^^^^                      1
#                   ^^^^^^^^   2
#          ^^^^^^^^            3
  1. 仅在read命令的持续时间内,为变量IFS分配值()
  2. 将字符串"$s"发送到read的stdin
  3. 来自stdin,使用$IFS将输入拆分为单词:将第一个单词分配给变量a,将其余字符串分配给变量b。来自字符串末尾的$IFS的尾随字符将被丢弃。
  4. 文档:

    希望有所帮助。