[英]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.