【问题标题】:Splitting a list of words from a text file into an array in BASH将文本文件中的单词列表拆分为 BASH 中的数组
【发布时间】:2015-07-24 16:04:00
【问题描述】:

在过去的一个小时左右,我一直在与这个问题作斗争,我正在尝试将一个包含名称的文本文件放入这些单词的数组中。

文本文件已格式化:

Word1~~Word2 Word1~~Word2

.. 最终,我想将这些单词分成 2 个 word1 和 word2 数组,它们在“~~”处中断,但这是以后的问题

现在我(目前)有这个:

#!/bin/bash

a=$(cat ~/words.txt)
c=0

for word in $a
do
    arrayone[$c]=(echo $word)
    c=$((c+1))
done

我尝试了许多其他方法,但所有方法都不起作用或在执行时出错,我在 BASH 方面相对较新,语法非常困难

感谢您的宝贵时间

【问题讨论】:

标签: arrays bash shell scripting


【解决方案1】:

实际上现在解决您的“以后”问题同样容易。除非您需要能够处理带有(未配对)文字 ~ 字符的单词,否则可以这样做:

declare -a arr1=() arr2=()
while IFS='~' read -r word1 _ word2; do
  arr1+=( "$word1" )
  arr2+=( "$word2" )
done <file

printf 'Words in column 1:\n'
printf '  %s\n' "${arr1[@]}"

printf 'Words in column 2:\n'
printf '  %s\n' "${arr2[@]}"

如果您确实需要处理更有趣的情况,仅将双波浪号视为特殊情况,一种方法是使用正则表达式匹配:

while IFS='' read -r line; do
  if [[ $line =~ (.*)[~][~](.*) ]]; then
    arr1+=( "${BASH_REMATCH[1]}" )
    arr2+=( "${BASH_REMATCH[2]}" )
  else
    printf 'Line does not match pattern: %s\n' "$line" >&2
  fi
done <file

【讨论】:

  • 在执行声明语句时,当我尝试最近从该站点尝试过的大多数事情时,我得到了同样的错误:'test.sh:5:test.sh:语法错误:“( "意想不到' 另外,什么是
  • 你的shell真的是bash吗?使用#!/bin/shsh yourscript 意味着您正在运行POSIX sh,而不是bash; POSIX sh 根本没有数组。
  • echo "$BASH_VERSION" 的输出是什么,如果放在你的脚本中?
  • 这就是我的想法,它的 bash v. 4.3.11(1),也许我要运行它错误?我在终端中执行“sh test.sh”
  • (另外,因为 bash 脚本 不是 POSIX sh 脚本,所以用 .sh 扩展名命名它们是不好的形式——这意味着有人可以运行 sh yourscript,这不一定有效。最佳实践是根本不将文件扩展名放在脚本上——它们定义了命令,毕竟你不运行ls.elf)。
猜你喜欢
  • 2016-09-16
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2023-01-17
相关资源
最近更新 更多