3つの単一引用符の間のテキストを抽出する


8

次のファイルを持っています

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

このファイルの他のいくつかのものと一緒に。

シェルスクリプトでこの部分を抽出しますsed -n "/'''/,/'''/p" $1$1ファイルはです)。

これにより、コンテンツを1つのライナーとして含む変数が得られます

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

どうすれば、次の間にある部分を抽出でき'''ますか?

それとも、複数行のファイルからそれを取得するより良い方法はありますか?

私はMac El Captain 10.11.2とGNU bash、バージョン3.2.57(1)-release(x86_64-apple-darwin15)を使用しています


3
変数を二重引用符で囲みます。その場合、改行が含まれます。
DisplayName

1
これはYAMLですよね?YAMLパーサーを実際に使用していない理由は何ですか?
Charles Duffy

@DisplayName、...明確にするために、エコー時に二重引用符を意味しますよね?
Charles Duffy

回答:


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

'' 'の各ペアの間の部分を抽出(および改行を続けて出力)します。

perl非常に大きなファイルにはソリューションが適切でない場合があるため、処理を開始する前にメモリ内のファイル全体を丸呑みすることに注意してください。


7

持っている場合、gawkまたはmawk自由に使える場合は、これを試してください。

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

これは'''、ファイルに他の-s がないことを前提としています。

説明:レコード分離文字を3つの単一引用符に設定し、レコード番号が偶数の場合に出力します。

残念ながら、awk複数文字のレコード区切り文字はの一部ではないため、すべての実装で動作するわけではありませんPOSIX awk


(私の)Mac端末はデフォルトでgawkを知りません。
Emerson Cod

4

awkの回答ほど良くはありませんが、元々はsedを使用していたので

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

またはコメントでglenn jackmanが指摘したように短い(わずかに変更)

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

として実行

sed -f script file

出力

    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
あなたはそれをsedに凝縮することができますsed -n "/'''/,//{//!p}"-おそらくset +H履歴の拡張をオフにするために最初にbashで行う必要があります。
グレン

@glennjackmanそれがスクリプトにそれを含めた理由でした。IMOは常により読みやすく、グロビング、拡張などのシェル関数の影響を受けません。とにかく、元のスクリプトよりも簡潔なので、答えに追加しました。
123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.