【问题标题】:Bash. Split text to array by delimiter [duplicate]重击。通过分隔符将文本拆分为数组[重复]
【发布时间】:2021-08-29 03:05:07
【问题描述】:

谁能帮帮我。我想在 bash 中将 TEXT(带 \n 的变量)拆分为数组。

好的,我有一些文本变量:

variable='13423exa*lkco3nr*sw
kjenve*kejnv'

我想将它拆分为数组。 如果变量中没有新行,我会这样做:

IFS='*' read -a array <<< "$variable"

我假设第三个元素应该是:

echo "${array[2]}"
>sw
>kjenve

但是使用新行它不起作用。请给我正确的方向。

【问题讨论】:

  • I want to split TEXT(variable with \n) into array in bash. 你确定要这个吗?你在问 XY 问题吗?

标签: arrays linux bash shell


【解决方案1】:

您可以使用readarray 命令并像以下示例一样使用它:

readarray -d ':' -t my_array <<< "a:b:c:d:"

for (( i = 0; i < ${#my_array[*]}; i++ )); do  
  echo "${my_array[i]}"  
done  

-d 参数定义分隔符,-t 要求删除最后一个分隔符。

【讨论】:

  • mapfile: -d: 无效选项
  • 取决于您使用的 linux 发行版。 mapfilereadarray 的同义词,试试这个。我更新帖子...
【解决方案2】:

使用 readarray。

$ variable='13423exa*lkco3nr*sw
kjenve*kejnv'
$ readarray -d '*' -t arr < <(printf "%s" "$variable")
$ declare -p arr
declare -a arr=([0]="13423exa" [1]="lkco3nr" [2]=$'sw\nkjenve' [3]="kejnv")

mapfile: -d: 无效选项

更新 bash,然后使用 readarray

如果不是,则用零字节替换分隔符,并用read -d '' 逐个元素地读取它。

arr=()
while IFS= read -d '' -r e || [[ -n "$e" ]]; do
     arr+=("$e")
done < <(printf "%s" "$variable" | tr '*' '\0');
declare -p arr
declare -a arr=([0]="13423exa" [1]="lkco3nr" [2]=$'sw\nkjenve' [3]="kejnv")

【讨论】:

    【解决方案3】:

    使用不同于换行符的结束字符

    end=.
    read -a array -d "$end" <<< "$v$end"
    

    当然,此解决方案假设您的输入变量中至少有一个字符未使用。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2017-03-21
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      相关资源
      最近更新 更多