Arrays 基于空行或任何未使用的字符将文本文件拆分为数组

Arrays 基于空行或任何未使用的字符将文本文件拆分为数组,arrays,bash,ascii,echo,ifs,Arrays,Bash,Ascii,Echo,Ifs,我有一个文本文件,其中包含由空行文本分隔的文本行。我想将该文件的内容推送到一个数组中,并使用空行作为分隔符。我尝试了IFS=“\n”(或“\r\n”等…)但无法使其工作,因此我想用文件中不存在的字符替换任何空行,因此我选择了西班牙语倒问号(\xBF) 这就行了,我有一个角色,我将用它来分割我的文件并将其放入数组中。(这是一个随机的技巧,但嘿,这只是一种方法。) 现在我需要更改$IFS,这样它就可以使用倒过来的问号来分割数组的数据 如果我打字 IFS=$(echo -e "\xBF") 在命令行

我有一个文本文件,其中包含由空行文本分隔的文本行。我想将该文件的内容推送到一个数组中,并使用空行作为分隔符。我尝试了IFS=“\n”(或“\r\n”等…)但无法使其工作,因此我想用文件中不存在的字符替换任何空行,因此我选择了西班牙语倒问号(\xBF)

这就行了,我有一个角色,我将用它来分割我的文件并将其放入数组中。(这是一个随机的技巧,但嘿,这只是一种方法。)

现在我需要更改$IFS,这样它就可以使用倒过来的问号来分割数组的数据

如果我打字

IFS=$(echo -e "\xBF")
在命令行中,它可以正常工作

 echo "$IFS"
¿
但是,如果我键入带有尾部read-a的命令,则它不会执行任何操作:

[user@machine ~]$ IFS=$(echo -e "\xBF") read -a array <<< "$var"
[user@machine ~]$ echo "$IFS"
[user@machine ~]$
这是IFS的默认值

我很确定一个人可以在IFS中使用任何字符,不是吗

或者,如果你有什么诀窍,可以使用基于空行的拆分来拆分数组中的文件,我很感兴趣!(为了理解起见,我还是想弄清这件事的真相)


非常感谢,祝您周末愉快:)

首先,根据设计,使用
var=foo命令设置的变量只对
命令可用,不会在脚本的其余部分设置

至于您的问题,
read
读取记录直到第一个分隔符(
-d
,默认值:换行符),然后按
$IFS
将其拆分为字段

要在项目上循环,可以使用

sed -e 's/^$/\xBF/' | while read -d $'\xBF' var
do
    printf "Value: %s\n-----\n" "$var"
done
要将它们全部从字符串读入数组,您可以一直读取到希望没有的某个字符,如NUL字节:

IFS=$'\xBF' read -d '' -a array <<< "$var"

IFS=$'\xBF'read-d'-数组此脚本应执行您想要的操作:

#!/bin/bash

i=1
s=1
declare -a arr
while read -r line 
do
    # If we find an empty line, then we increase the counter (i), 
    # set the flag (s) to one, and skip to the next line
    [[ $line == "" ]] && ((i++)) && s=1 && continue 

    # If the flag (s) is zero, then we are not in a new line of the block
    # so we set the value of the array to be the previous value concatenated
    # with the current line
    [[ $s == 0 ]] && arr[$i]="${arr[$i]}
$line" || { 
            # Otherwise we are in the first line of the block, so we set the value
            # of the array to the current line, and then we reset the flag (s) to zero 
            arr[$i]="$line"
            s=0; 
    }
done < file

for i in "${arr[@]}"
do
   echo "================"
   echo "$i"
done 
输出:

================
asdf dsf s dfsdaf s
sadfds fdsa fads f dsaf as
================
fdsafds f dsf ds afd f saf dsf
sdfsfs dfadsfsaf
================
sdfsafds fdsafads fd saf adsfas
sdfdsfds fdsfd saf dsa fds fads f
更新:

要忽略以
#
开头的行,可以在
do
之后添加此行:

[[ $line =~ ^# ]] && continue

谢谢你的回复!但我不确定“你的命令”应该是什么。你能解释一下吗?谢谢!:)这将是您生成
\xBF
分隔项的命令,您似乎只指定了问题中的部分。我已经用它更新了。谢谢,它工作得很好,但我不明白while循环中发生了什么。请您解释一下好吗?:)谢谢@布鲁兹补充了一个解释。如果您需要任何额外的澄清,请告诉我。非常感谢!我理解标志的含义,虽然我正在尝试grep文件以删除原始文件中的注释(以#开头的行),但我正在努力…不确定我的grep-vE“^[#]*”放在哪里。你能帮忙吗?我保证在那之后我不会再提我的问题了!:)再次感谢您的帮助!:)@Bluz为什么不在新文件上运行脚本!非常感谢!
$ cat file
asdf dsf s dfsdaf s
sadfds fdsa fads f dsaf as

fdsafds f dsf ds afd f saf dsf
sdfsfs dfadsfsaf

sdfsafds fdsafads fd saf adsfas
sdfdsfds fdsfd saf dsa fds fads f
================
asdf dsf s dfsdaf s
sadfds fdsa fads f dsaf as
================
fdsafds f dsf ds afd f saf dsf
sdfsfs dfadsfsaf
================
sdfsafds fdsafads fd saf adsfas
sdfdsfds fdsfd saf dsa fds fads f
[[ $line =~ ^# ]] && continue