Bash - 将缩进的代码块提取到新文件中

Bash - 将缩进的代码块提取到新文件中

我有一堆荷花池以下格式的文件:

\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
}

在这种情况下,不一定需要修复压痕。那会是一个awkorcsplit任务吗?它会是什么样子?

答案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 "${@:--}"

相关内容