每次出現正則表達式時如何拆分文件?
每次段落包含出現“7-04/PNLP-000001”形式的程式碼時,我都試圖讓 gawk 將文本文件拆分為不同的文件。因此,例如,如果原始文本文件包含以下內容:
第 7-04/PNLP-000009 號法律的提案號,與塞維利亞-科爾多瓦-馬德里大道線有關。
主席
提案第 7-04/PNLP-000001 號法律,關於恢復和改善安達盧西亞農村工人的權利和社會覆蓋面。
總統女士
我想獲得一個包含以下內容的文件:
第 7-04/PNLP-000009 號法律的提案號,與塞維利亞-科爾多瓦-馬德里大道線有關。
總統女士
另一個包含以下內容:
第 7-04/PNLP-000001 號法律提案,關於恢復和改善安達盧西亞農村工人的權利和社會覆蓋面。
總統女士
我正在嘗試使用此程式碼:
gawk ' /^\n.+[0-9]\-[0-9]{2}\/.+\-[0-9]{6}$/ {if (p) close (p) p = sprintf("split%05i.txt", ++i) } { print > p; } ' input.txt
但是,這只是每行創建一個文件,無論其內容如何。有誰知道我做錯了什麼?提前致謝!
你很接近:
awk '/[0-9]-[0-9]{2}\/[[:upper:]]+-[0-9]{6}/ { if (file) close (file) file = sprintf("split%05i.txt", ++i) } file {print > file}' input.txt
您希望
{ if... }
為匹配模式的行執行程式碼塊[0-9]...
,因此,它應該與/.../
.
{print > file}
只要file
設置,第二個程式碼塊將針對每條記錄執行,file
用作條件。在
\n
這裡使用您的模式沒有意義,因為awk
依次處理的每個記錄都是每行的內容(因為預設記錄分隔符 (RS
) 是\n
),因此記錄永遠不會包含換行符。您也不想在此處錨定您的正則表達式(^
和$
)。我已將您的替換
.+
為[[:upper:]]+
更具體的內容。例如,.+
它會匹配上blah 5-10/2 blah blah €1000000
。您可能需要根據要接受的內容來代替PNLP
.請注意,它也匹配 on ,因為它確實包含與模式匹配的字元串(參見粗體部分)。
blah 123**4-56/XX-123456**7890 blah
我已經刪除了
g
ingawk
因為該程式碼不是gawk
特定的。但是請注意,仍然有一些 awk 實現不支持上面的{2}
/{6}
運算符(即使這是 POSIX 要求),因此如果您知道gawk
將可用,您不妨使用它來確保它可以正常工作。