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