簡體   English   中英

如何從文本文件中的第一個空行開始刪除所有行?

[英]How to remove all lines from a text file starting at first empty line?

從 Bash 中的第一個空行開始從文本文件中刪除所有行的最佳方法是什么? 可以使用外部工具(awk、sed...)!

例子

1: ABC
2: DEF
3:
4: GHI

應刪除第 3 行和第 4 行,並將剩余內容保存在新文件中。

使用GNU sed

sed '/^$/Q' "input_file.txt" > "output_file.txt" 

使用AWK

$ awk '/^$/{exit} 1' test.txt > output.txt

output.txt 的內容

$ cat output.txt 
ABC
DEF

演練:對於匹配 ^$(行首、行尾)的行,退出(整個腳本)。 對於所有行,打印整行——當然,在一行讓我們退出后,我們不會到達這一部分。

打賭有一些更聰明的方法可以做到這一點,但這里有一個使用 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

和 'rest_of_stuff' 有

GHI

如果您希望前空白行除 stdout 之外的其他地方,只需重定向:

$ ./delete_from_empty.sh after_blank < input_file > before_blank

你最終會得到兩個新文件:after_blank 和 before_blank。

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

另一個 awk 是:

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

通過將記錄分隔符RS設置為空字符串,我們將記錄定義為由一系列空行分隔的段落 現在很容易調整它以選擇第 n 個塊:

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

在處理帶有 DOS 行尾 (CRLF) 的文件時,此方法存在問題。 不會有空行,因為行中總會有一個 CR。 但是這個問題適用於所有提出的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM