我試圖使用一個命令列程式,將一個較大的文本檔案分割成若干塊,其中包括:
- 根據定義的regex模式進行分割
- 根據定義的重合碼模式進行分割 由該regex模式中的捕獲組定義的filenames。
文本檔案的格式是:
# title
# 2020-01-01
多行內容
到此為止
# 2020-01-02 多行內容放在這里。
其他多行內容
到此為止
輸出應該是這兩個檔案,檔案名和內容如下:
2020-01-01.md ↓
# 2020-01-01
多行內容
到此為止
2020-01-02.md ↓
# 2020-01-02
其他多行內容
到此為止
我似乎不能正確地掌握所有的標準。
要分割的regex模式(分隔符)很簡單,類似于^# (2020-.*)$
要么我不能設定一個多行的鉸鏈模式,超過的新行并停止。
新行并在分隔符模式的下一次出現時停止。
或者我可以用csplit對regex模式進行分割,但我不能用(2020-.*)捕獲的內容來命名檔案。
對于awk的split()或match()也是如此,不能讓它完全發揮作用。
我正在尋找一個通用的解決方案,引數是定義塊開始(例如:# 2020-01-01)和結束(例如:下一個日期標題# 2020-01-02或EOF)的regex模式
uj5u.com熱心網友回復:
使用這個regex,這里有一個perl來做:
perl -0777 -nE 'while (/^h*#h*(2020.*)([sS]*?(? :(?=(^h*#h*2020.*))|z))/gm) {
open($fh, ">", $1.".md") or die $!;
列印 $fh 1;
列印 $fh 2;
關閉$fh。
}'檔案
結果:
head 2020*.
==> 2020-01-01.md <==
2020-01-01
多行內容
到此為止
==> 2020-01-02.md <==
2020-01-02
其他多行內容
到此為止
uj5u.com熱心網友回復:
在每個Unix盒子的任何shell中使用任何awk:
$ awk '/^# [0-9]/{ close(out); out=$2".md" } out! =""{print > out}' file
$ head *.md
==> 2020-01-01.md <==
# 2020-01-01
多行內容
到此為止
==> 2020-01-02.md <==
# 2020-01-02
其他多行內容
歸于此處
如果/^# [0-9]/不是一個適當的重合運算式,那么就把它改成你喜歡的,例如/^# [0-9]{4}(-[0-9]{2}){2}$/將是更嚴格的。不過,如果你沒有要求,我根本就不會使用重構運算式來處理這個問題。我會使用:
awk '(1=="#") && (c ){ close(out); out=$2".md" } out!=""{print > out}'/span> file
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318128.html
標籤:
