Text-Processing

Bash - 將縮進的程式碼塊提取到新文件中

  • December 2, 2019

我有一堆以下格式的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
}

在這種情況下,不一定需要修復縮進。那會是一個任務嗎awkcsplit它會是什麼樣子?

您可能想考慮如何處理輸出,例如使用輸入名稱和輸出的副檔名。修改縮進應該不難。

該腳本列出了命令行中命名的任意數量的文件,以及一個文件中任意數量的此類塊。

這是您的範例的輸出:

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

引用自:https://unix.stackexchange.com/questions/555084