2017-10-04 26 views
0

我想將STARTEND標記之間的每個文本塊提取到單獨的文件。 Sed會是首選的工具,但grep和awk也可以。將兩個標記之間的每個文本塊寫入sed文件

鑑於以下文件內容:

abc 
START 
    def 
END 
ghi 
START 
    jkl 
END 
mno 

的sed應分別建立兩個文件的內容:

START 
    def 
END 

START 
    jkl 
END 

我知道怎麼弄的內容兩個正則表達式與sed:

sed -n '/START/,/END/p' 

當提供e標誌時,還有一個在sed內執行shell命令的選項。這可以用於這項任務嗎?

回答

2

這可能爲你工作(GNU SED):

sed '/START/,/END/!d' file | csplit -z - '/END/1' '{*}' 

用sed來收拾開始和結束分隔符之間的所有行,然後應用csplit可創建單獨的文件爲每個組線。

+0

++ ve爲了很好的代碼。感謝你提供了非常好的代碼,請你解釋一下csplit會對你感激。 – RavinderSingh13

+2

@ RavinderSingh13 csplit是拆分的變體。它需要一個文件和一些模式(如果需要,可以使用偏移量)。請參閱info/man csplit或csplit -h。 – potong

+0

不錯的做法,但爲什麼它會爲這個例子生成3個文件?最後一個是空的,前兩個是預期的。 –

1

awk來這裏保存:

awk '/END/{flag="";print > i"_file";close(i"_file");next} /START/{flag=1;print > ++i"_file";next} flag{print > i"_file"}' Input_file 

輸出將創建2個文件1_file命名,並用以下內容2_file。

cat 1_file 
START 
    def 
END 

cat 2_file 
START 
    jkl 
END 

現在也增加一種非線性形式的解決方案。

awk ' 
/END/{ 
    flag=""; 
    print > i"_file"; 
    close(i"_file"); 
    next 
} 
/START/{ 
    flag=1; 
    print > ++i"_file"; 
    next 
} 
flag{ 
    print > i"_file" 
} 
' Input_file 
1

非常有趣csplit可

感謝波東

因此,沒有sed的

csplit -z --suppress-matched infile %START%-1 /END/1 {*} 

-m = --suppress匹配不起作用。

manpage fr tell -m但它是錯誤的。

+0

適用於這個例子,但是如果'START'在第一行,它會抱怨行號超出範圍 –

+1

您可以像這樣使用它(echo; cat infile)| csplit - -z -s - 壓縮匹配%START%-1/END/1 {*} –

相關問題