从Bash的第一个空行开始删除文本文件中的所有行的最佳方法是什么?可以使用外部工具(awk,sed ...)!
实施例
1: ABC
2: DEF
3:
4: GHI
应删除第3行和第4行,其余内容应保存在新文件中。
答案 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。但是这个问题适用于所有提出的方法。