击分割多行字符串由多字符定界符成阵列

问题描述 投票:0回答:6

我已经寻找这里类似的话题,但大多数问题包括单字符分隔符。

我有文字的这个示例:

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

和期望的输出是包含列表(extracted=()):

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

正如可以从样品中可以看出,“分隔符”作为分割符。

我曾尝试在SO含AWK众多样品,更换等。

bash shell awk
6个回答
2
投票

如果你不想更改默认RS值,那么你可以请尝试以下。

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

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] = $“的文本\第二块nwhich不妨继续下一行” [2] =“最终块”)

可以使用阵列索引访问每一行或者可以打印用printf“%S \ N”中的所有行“$ {阵列[@]}”

其结果将是

继续对文本的下一行第二块可能还有继续下一行最后一块

该解决方案为您提供了一个机会,做了很多与你的文字。


0
投票

你可以尝试这样的:

awk 'BEGIN {RS="DELIMITER";} {print}' input_file

然后将其分配给变量,等等。


0
投票

随着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的阵列,将根据阵列上的后续工序需要进一步的步骤。


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

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


$
© www.soinside.com 2019 - 2024. All rights reserved.