Text-Processing
Bash - 將縮進的程式碼塊提取到新文件中
我有一堆以下格式的LilyPond文件:
\score { \new StaffGroup = "" \with { instrumentName = \markup { \bold \huge \larger "1." } } << \new Staff = "celloI" \with { midiInstrument = #"cello" } \relative c { \clef bass \key c \major \time 3/4 \tuplet 3/2 4 { c8(\downbow\f b c e g e) } c'4 | %01 \tuplet 3/2 4 {c,8( b c e f a) } c4 | %02 \tuplet 3/2 4 { g,8( d' f g f d) } b'4 | %03 } >> \layout {} \midi {} }
如何將
\relative c {...}
塊提取到一個新文件中,所以它看起來像這樣:\relative c { \clef bass \key c \major \time 3/4 \tuplet 3/2 4 { c8(\downbow\f b c e g e) } c'4 | %01 \tuplet 3/2 4 {c,8( b c e f a) } c4 | %02 \tuplet 3/2 4 { g,8( d' f g f d) } b'4 | %03 }
在這種情況下,不一定需要修復縮進。那會是一個任務嗎
awk
?csplit
它會是什麼樣子?
您可能想考慮如何處理輸出,例如使用輸入名稱和輸出的副檔名。修改縮進應該不難。
該腳本列出了命令行中命名的任意數量的文件,以及一個文件中任意數量的此類塊。
這是您的範例的輸出:
Paul--) ./LilyPond Lily.txt \relative c { \clef bass \key c \major \time 3/4 \tuplet 3/2 4 { c8(\downbow\f b c e g e) } c'4 | %01 \tuplet 3/2 4 {c,8( b c e f a) } c4 | %02 \tuplet 3/2 4 { g,8( d' f g f d) } b'4 | %03 }
這是腳本。
Paul--) cat LilyPond #! /bin/bash function Relative { local AWK=''' BEGIN { reRel = "[\\\\]relative[ ]+c"; } function cntBrace (tx, Local, n) { n += gsub ("{", "{", tx); n -= gsub ("}", "}", tx); return (n); } $0 ~ reRel || nBrace > 0 { print; nBrace += cntBrace( $0); } ''' awk -f <( echo "${AWK}" ) "${@}" } #### Script Body Starts Here. Relative "${@:--}"