私は次の形式の 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
タスクでしょうか?それはどのように見えるでしょうか?
出力の拡張子を付けて入力名を使用するなど、出力をどうするかを考えたい場合があります。インデントの変更は難しいことではありません。
このスクリプトは、コマンドラインで指定された任意の数のファイルと、1つのファイル内の任意の数のそのようなブロックを一覧表示します。
これはサンプルからの出力です:
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 "${@:--}"