gpt4 book ai didi

arrays - 根据空行或任何未使用的字符将文本文件拆分为数组

转载 作者:行者123 更新时间:2023-11-29 09:03:44 25 4
gpt4 key购买 nike

我有一个文本文件,其中包含由空文本行分隔的文本行。我想将该文件的内容推送到一个数组中,并使用空行作为分隔符。我试过 IFS="\n"(或 "\r\n"等)但无法让它工作所以我想我会用文件中没有的字符替换任何空行,所以我拿起了西类牙倒问号 (\xBF)

sed 's/^$/'$(echo -e "\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 ~]$

这很奇怪,因为 $var 有一个值。

更令人惊讶的是,当我在得到之后立即验证 IFS 的值时:

[user@machine ~]$ echo -n "$IFS" | od -abc
0000000 sp ht nl
040 011 012
\t \n
0000003
[user@machine ~]$

这是 IFS 的默认值。

我很确定可以为 IFS 使用任何字符,不是吗?

或者,如果您有任何技巧可以将文件拆分为一个数组,并根据空行进行拆分,我很感兴趣! (为了便于理解,我还是想深入了解一下)。

非常感谢,周末愉快:)

最佳答案

这个脚本应该做你想做的:

#!/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

测试文件:

$ 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

更新:

为了忽略以#开头的行,您可以在do之后添加这一行:

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

关于arrays - 根据空行或任何未使用的字符将文本文件拆分为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18539369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com