使用Bash将多行字符串按多个字符分隔符拆分为数组

3

我在这里搜索了类似的话题,但大多数问题都包含单字符分隔符。

我有这个文本示例:

Original Answer翻译成"最初的回答"

Some text here,
continuing on next lineDELIMITERSecond chunk of text
which may as well continue on next lineDELIMITERFinal chunk

期望的输出是一个列表 (extracted=()),其中包含:

  1. 这里有一些文本, 接着下一行
  2. 第二块文本 可能也会继续到下一行
  3. 最后一块

从示例中可以看出,“DELIMITER”被用作分隔符。

我已经尝试了许多SO上的样本,包括awk、替换等。

注:原始答案的翻译为“最初的回答”。


2
请更清楚地说明预期输出。同时,在您的帖子中也要提及您的努力。 - undefined
你的需求不太清楚。你是在建议即使输入跨越多行,你希望将内容拆分为一个字符串吗?也就是说,最终的字符串应该是Some text here,continuing on next line作为最终数组中的一个条目吗? - undefined
6个回答

5

如果您不想更改默认的RS值,那么请尝试以下步骤。

awk '{gsub("DELIMITER",ORS)} 1' Input_file

怎样把它放进一个数组里? 我试过把它放在括号()里,但是访问元素像[0] [1]会得到单词(因为空格分隔)。 - undefined
1
@Hubbs 尝试:tab=($(awk '{gsub("DELIMITER",""")} 1' infile ));echo "${tab[1]}" - undefined
@ctac_,谢谢ctac,如果你想的话,你可以编辑我的答案,或者我也可以在我的解决方案中添加它,请告诉我。 - undefined
1
@RavinderSingh13 在你的回答中添加它。 - undefined
@ctac_ 使用这个会输出一个单词,而不是分隔符之前的整个句子。 - undefined
1
@Hubbs 抱歉,缺少IFS。请尝试使用IFS = '"',tab =($(awk'{gsub("DELIMITER",""")}1' infile)); echo $ {tab [1]} - undefined

1
请使用AWK尝试以下操作:
awk -v RS='^$' -v FS='DELIMITER' '{
    n = split($0, extracted)
    for (i=1; i<=n; i++) {
        print i". "extracted[i]
    }
}' sample.txt

结果为:

1. Some text here,
continuing on next line
2. Second chunk of text
which may as well continue on next line
3. Final chunk

如果您需要将awk数组转换为bash数组,则根据数组的后续处理过程,可能需要进一步操作。

1
你可以尝试使用数组。
#!/bin/bash
str="continuing on next lineDELIMITERSecond chunk of text
which may as well continue on next lineDELIMITERFinal chunk";


delimiter=DELIMITER
s=$str$delimiter

array=();
while [[ $s ]]; do
array+=( "${s%%"$delimiter"*}" );
s=${s#*"$delimiter"};
done;
declare -p array

这将根据您的分隔符将文本拆分为数组,结果将是文本的数组。
数组=([0] =“在下一行继续”[1] = $'第二个文本块\n也可能在下一行继续'[2] =“最后一个块”)
您可以使用数组索引访问每一行,或者您可以使用printf'%s\n' "${array[@]}"打印所有行。
结果将是
在下一行继续 第二个文本块 也可能在下一行继续 最后一个块
该解决方案为您提供了许多处理文本的机会。

0
你可以尝试使用Perl。通过使用-0777选项,Perl会将整个文件读入一个$_变量中。然后你可以使用分隔符来拆分内容。试试看吧。
$ perl -0777 -ne '@x=split("DELIMITER");print join("\n\n",@x) ' hubbs.txt
Some text here,
continuing on next line

Second chunk of text
which may as well continue on next line

Final chunk

$

打印时添加数组位置

$ perl -0777 -ne '@x=split("DELIMITER"); for(@x) { print ++$i,". $_\n"  } ' hubbs.txt
1. Some text here,
continuing on next line
2. Second chunk of text
which may as well continue on next line
3. Final chunk


$

0
你可以尝试这样做:
awk 'BEGIN {RS="DELIMITER";} {print}' input_file

然后将其赋值给变量,等等...


0

我认为该问题中最大的挑战是正确处理空格、换行符和定界符,并将所有内容放入一个数组中。如果只是拆分文件的话,那就太容易了。这个模板怎么样:

#!/bin/bash
gencode(){
  echo -e "extracted=(); read -r -d '' item <<-DELIMITER"
  sed 's:DELIMITER:\n&\nextracted+=("$item"); read -r -d "" item <<-&\n:' Input_file;
  echo -e "DELIMITER\n"'extracted+=("$item")'
}
gencode|cat -n                                 # for explaination purpose only
eval "`gencode`"                               # do not remove "eval"
for (( i=0; i < ${#extracted[@]}; i++ )); do   # print results
  echo "$i: ${extracted[i]}"
done

输出

     1  extracted=(); read -r -d '' item <<-DELIMITER
     2  Some text here,
     3  continuing on next line
     4  DELIMITER
     5  extracted+=("$item"); read -r -d "" item <<-DELIMITER
     6  Second chunk of text
     7  which may as well continue on next line
     8  DELIMITER
     9  extracted+=("$item"); read -r -d "" item <<-DELIMITER
    10  Final chunk
    11  DELIMITER
    12  extracted+=("$item")
0: Some text here,
continuing on next line
1: Second chunk of text
which may as well continue on next line
2: Final chunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接