Bash在双换行符上拆分文件

时间:2015-06-09 23:18:40

标签: bash

我有一些文件的内容在不同文件之间有所变化。 每个文件有2个由空行分隔的行。 我从来不知道两个部分中有多少行或字符。

文件看起来像这样。

This is a file
with some text

and some more text

此代码仅提供每个部分的第一行。

awk 'BEGIN {RS="\n\n"; FS="\n";} {print $1 }' file

我需要将每个部分分开使用。

5 个答案:

答案 0 :(得分:3)

打印第一部分: sed '/^$/q' test.txt

打印第二部分: sed '1,/^$/d' test.txt

答案 1 :(得分:3)

RS设置为空/空值以使awk对空行序列进行操作。

来自POSIX specification for awk

  

<强> RS

     

RS的字符串值的第一个字符应为输入记录分隔符;一个默认情况下。如果RS包含多个字符,则结果未指定。 如果RS为空,则记录由包含一个或多个空行的序列分隔,前导或尾随空白行不应在输入的开头或结尾处产生空记录,并且a应始终为字段分隔符,无论FS的值是什么。

答案 2 :(得分:3)

由于标记为bash,因此可能还有原生bash解决方案。

sections=( )
current_section=
while REPLY=; IFS= read -r || [[ $REPLY ]]; do
  if [[ $REPLY ]]; then
    # preserve newlines within the sections
    if [[ $current_section ]]; then
      current_section+=$'\n'"$REPLY"
    else
      current_section+=$REPLY
    fi
  else
    sections+=( "$current_section" )
    current_section=
  fi
done <file

这会将文件的各个部分放入名为sections的bash数组中。

您可以像这样打印该数组的内容:

printf -- '---\n%s\n---\n' "${sections[@]}"

...或者根据需要进行迭代:

for section in "${sections[@]}"; do
  : do something with "$section" here
done

答案 3 :(得分:0)

假设有两个部分,这个非常简单的Perl技巧将打印标准输出,直到遇到一个空行,然后其余部分出错;

 perl -ne 'if (1../^$/) { print STDOUT } else { print STDERR }'

e.g。    猫tmp0 | perl -ne&#39; if(1 ../^$/) {print STDOUT} else {print STDERR}&#39; &GT; tmp1 2&gt; TMP2

TMP1:

This is a file
with some text

TMP2:

and some more text

答案 4 :(得分:0)

IFS=";"
sections=($(awk -v RS= '{print $0 ";"}' filename))

IFS=;将内部字段分隔符从空格(默认)设置为分号

$(awk -v RS= '{print $0 ";"}' filename)给出了用;分隔的所有部分。

sections=(awk_output_here)会根据IFS拆分awk输出,并将每个部分转换为数组的元素。因此,sections包含基于双换行的每个部分。