Estrai il testo tra tre virgolette singole


8

Ho il seguente in un file

description: '''
        This rule forbids throwing string literals or interpolations. While
        JavaScript (and CoffeeScript by extension) allow any expression to
        be thrown, it is best to only throw <a
        href="https://developer.mozilla.org
        /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects,
        because they contain valuable debugging information like the stack
        trace. Because of JavaScript's dynamic nature, CoffeeLint cannot
        ensure you are always throwing instances of <tt>Error</tt>. It will
        only catch the simple but real case of throwing literal strings.
        <pre>
        <code># CoffeeLint will catch this:
        throw "i made a boo boo"

        # ... but not this:
        throw getSomeString()
        </code>
        </pre>
        This rule is enabled by default.
        '''

con molte altre cose in questo file.

Estraggo questa parte nel mio script di shell tramite sed -n "/'''/,/'''/p" $1(dove si $1trova il file).

Questo mi dà una variabile con il contenuto come una riga

description: ''' This rule forbids throwing string literals or interpolations. While JavaScript (and CoffeeScript by extension) allow any expression to be thrown, it is best to only throw <a href="https://developer.mozilla.org /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects, because they contain valuable debugging information like the stack trace. Because of JavaScript's dynamic nature, CoffeeLint cannot ensure you are always throwing instances of <tt>Error</tt>. It will only catch the simple but real case of throwing literal strings. <pre> <code># CoffeeLint will catch this: throw "i made a boo boo" # ... but not this: throw getSomeString() </code> </pre> This rule is enabled by default. '''

Come posso ora estrarre la parte tra i '''?

O c'è anche un modo migliore per recuperarlo dal file multilinea?

Sono su Mac El Captain 10.11.2 e GNU bash, versione 3.2.57 (1) -release (x86_64-apple-darwin15)


3
Metti le virgolette doppie attorno alla variabile, quindi contiene nuove righe.
DisplayName

1
Questo è YAML, giusto? Qualche motivo per cui non stai effettivamente utilizzando un parser YAML?
Charles Duffy,

@DisplayName, ... per essere chiari, intendi doppie virgolette quando fai eco , giusto?
Charles Duffy,

Risposte:


12
perl -l -0777 -ne "print for /'''(.*?)'''/gs" file

estrarrà (e stampa seguito da una nuova riga) la parte tra ogni coppia di '' '.

perlPrestare attenzione a snellire l'intero file in memoria prima di iniziare l'elaborazione in modo che la soluzione potrebbe non essere appropriata per file molto grandi.


7

Prova questo, se hai gawko mawka tua disposizione:

gawk -v "RS='''" 'FNR%2==0' file

Questo presuppone che non ci siano altri '''-s nel file.

Spiegazione: Imposta il separatore record su tre virgolette singole e stampa se il numero record è pari.

Sfortunatamente, non funzionerà con tutte le awkimplementazioni, poiché i separatori di record multi-carattere non fanno parte POSIX awk.


(my) Il terminale Mac non conosce gawk per impostazione predefinita.
Emerson Cod,

4

Non è carino come la risposta di awk ma come stavi usando sed

/'''/{
   s/.*'''//
   :1
   N
   /'''/!b1
   s/'''.*//
   p
}
d

O più breve, come sottolineato da Glenn Jackman nei commenti (leggermente modificato)

/'''/,//{
//!p
}
d

Correre come

sed -f script file

Produzione

    This rule forbids throwing string literals or interpolations. While
    JavaScript (and CoffeeScript by extension) allow any expression to
    be thrown, it is best to only throw <a
    href="https://developer.mozilla.org
    /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects,
    because they contain valuable debugging information like the stack
    trace. Because of JavaScript's dynamic nature, CoffeeLint cannot
    ensure you are always throwing instances of <tt>Error</tt>. It will
    only catch the simple but real case of throwing literal strings.
    <pre>
    <code># CoffeeLint will catch this:
    throw "i made a boo boo"

    # ... but not this:
    throw getSomeString()
    </code>
    </pre>
    This rule is enabled by default.

1
Puoi condensare quel sed a sed -n "/'''/,//{//!p}"- probabilmente devi fare set +Hprima in bash per disattivare l'espansione della storia.
Glenn Jackman,

@glennjackman Questo è stato il motivo per cui l'ho incluso in uno script, IMO è sempre più leggibile e come è immune alle funzioni della shell come globbing, espansione, ecc. Comunque l'ho aggiunto alla mia risposta in quanto è più conciso del mio script originale.
123
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.