Extraer texto entre tres comillas simples

8

Tengo lo siguiente en un archivo

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 varias otras cosas en este archivo.

Extraigo esta parte en mi script de shell a través de sed -n "/'''/,/'''/p" $1(donde $1está el archivo).

Esto me da una variable con el contenido como un revestimiento

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. '''

¿Cómo puedo extraer ahora la parte entre '''?

¿O hay incluso una mejor manera de recuperarlo del archivo multilínea?

Estoy en Mac El Captain 10.11.2 y GNU bash, versión 3.2.57 (1) -release (x86_64-apple-darwin15)

Bacalao Emerson
fuente
3
Pon comillas dobles alrededor de la variable, entonces contiene nuevas líneas.
DisplayName
1
Este es YAML, ¿verdad? ¿Alguna razón por la que no estás usando un analizador YAML?
Charles Duffy el
@DisplayName, ... para ser claros, te refieres a comillas dobles cuando haces eco , ¿verdad?
Charles Duffy

Respuestas:

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

extraería (e imprimiría seguido de una nueva línea) la parte entre cada par de '' '.

Tenga cuidado porque perlabsorbe todo el archivo en la memoria antes de comenzar a procesarlo, de modo que la solución puede no ser apropiada para archivos muy grandes.

Stéphane Chazelas
fuente
7

Prueba esto, si tienes gawko mawka tu disposición:

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

Esto supone que no hay otros '''-s en el archivo.

Explicación: establece el separador de registros en tres comillas simples e imprime si el número de registro es par.

Desafortunadamente, no funcionará con todas las awkimplementaciones, ya que los separadores de registros de varios caracteres no son parte de POSIX awk.

joepd
fuente
(mi) terminal Mac no conoce gawk por defecto.
Emerson Cod el
4

No es tan bueno como la respuesta awk pero como estabas usando originalmente sed

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

O más corto como lo señaló Glenn Jackman en los comentarios (ligeramente cambiado)

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

Correr como

sed -f script file

Salida

    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.
123
fuente
1
Puede condensar ese sed sed -n "/'''/,//{//!p}", probablemente tenga que hacerlo set +Hprimero en bash para desactivar la expansión del historial.
Glenn Jackman
@glennjackman Esa fue la razón por la que lo incluí en un script, en mi opinión, siempre es más legible y es inmune a las funciones de shell como globbing, expansión, etc. De todos modos, lo agregué a mi respuesta, ya que es más conciso que mi script original.
123