从第一个空行开始从文本文件中删除所有行的最佳方法

时间:2015-08-27 15:46:31

标签: linux bash

从Bash的第一个空行开始删除文本文件中的所有行的最佳方法是什么?可以使用外部工具(awk,sed ...)!

实施例

1: ABC
2: DEF
3:
4: GHI

应删除第3行和第4行,其余内容应保存在新文件中。

5 个答案:

答案 0 :(得分:1)

打赌有一些更聪明的方法可以做到这一点,但是这里有一个使用bash'阅读'内置。这个问题要求我们在一个文件中保留空白行之前的行,并将空白后的行发送到另一个文件。如果你愿意使用' exec'你可以发一些标准的一个地方和另一个地方。并且重新路由stdout mid-script,但是我将采用更简单的方法并使用命令行参数让我知道空白后数据应该去哪里:

#!/bin/bash

# script takes as argument the name of the file to send data once a blank line
# found
found_blank=0
while read stuff; do
    if [ -z $stuff ] ; then
            found_blank=1
    fi
    if [ $found_blank ] ; then
            echo $stuff > $1
    else
            echo $stuff
    fi
done

像这样运行:

$ ./delete_from_empty.sh rest_of_stuff < demo

输出是:

ABC
DEF

和&#39; rest_of_stuff&#39;具有

GHI

如果你想让前空白行去除stdout之外的其他地方,只需重定向:

$ ./delete_from_empty.sh after_blank < input_file > before_blank

并且您最终会得到两个新文件:after_blank和before_blank。

答案 1 :(得分:1)

使用AWK

tmp$ awk '/^$/{exit} {print $0}' test.txt > output.txt

output.txt

的内容
tmp$ cat output.txt 
ABC
DEF

演练:对于与^ $(行首,行尾)匹配的行,退出(整个脚本)。对于所有线路,打印整条线路 - 当然,在一条线路让我们退出后,我们将无法进入这一部分。

答案 2 :(得分:1)

使用sed

sed '/^$/,$ d' "input_file.txt" > "output_file.txt" 

答案 3 :(得分:1)

Perl版本

 perl -e '
        open $fh, ">","stuff";  
        open $efh, ">", "rest_of_stuff"; 
        while(<>){
           if ($_ !~ /\w+/){
                 $fh=$efh;
           } 
           print $fh $_;
         }
            ' demo

这将创建两个输出文件并迭代演示数据。当它碰到一个空行时,它会将输出从一个文件翻转到另一个文件。

创建

东西:

ABC
DEF

rest_of_stuff:

<blank line>
GHI

答案 4 :(得分:0)

另一个awk将是:

awk -vRS= '1;{exit}' file

通过将记录分隔符RS设置为空字符串,我们将记录定义为 paragraphs ,并用空行序列分隔。现在可以很容易地对其进行调整以选择第n个块为:

awk -vRS= '(FNR==n){print;exit}' file

使用DOS行尾(CRLF)处理文件时,此方法存在问题。将没有空行,因为该行中始终会有一个CR。但是这个问题适用于所有提出的方法。