web-dev-qa-db-ja.com

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タスクでしょうか?それはどのように見えるでしょうか?

2
nath

出力の拡張子を付けて入力名を使用するなど、出力をどうするかを考えたい場合があります。インデントの変更は難しいことではありません。

このスクリプトは、コマンドラインで指定された任意の数のファイルと、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 "${@:--}"

2
Paul_Pedant