パターンブロックの各行をEOLに置き換える

パターンブロックの各行をEOLに置き換える

次のテキストファイルがあります。

ここで、$はEOL(行末)の位置を表し、それを説明するために使用されます。

 53t83t5  5 gejgi3 gg 4gij503 $

      /* rtdrfsetsrhs               $
ryhrdhrh               $
rhyrdhyyyyyyyyyyyrhyrshrh$
ryhrhrh */$
$
345dfeb terfgb$
/*srdtfgyhgfs*/           $
$
$

/* */これで、このブロックの各行を次のように行の先頭にあるEOLに置き換える必要があります。 $の場所を参照してください。3号線/*これは、スペースを含む文字がある場合はスキップせず、スラッシュの代わりにEOLを入力する必要があることを意味します。

 53t83t5  5 gejgi3 gg 4gij503 $

      $
$
$
$
$
345dfeb terfgb$
/*srdtfgyhgfs*/           $
$
$

ブロック全体を削除してブロックを検出できますが、sed '/\/\*/,/\*\//d inputFile.sedスクリプトでsedコマンドを使用して上記の操作を実行できるかどうかを知りたいです。

メモ: /*...*/これは、パターンブロックを記述するために使用され、例えば、他のパターンを含むブロックを有することもできる。あるいは<--...-->!!...!!作品を知りたいのですが、/*...*/他のすべてを自分で処理できます。

答え1

予想される出力から少なくとも1つの改行文字を含むブロックから改行文字を除くすべての文字を削除したいようです。

したがって、以下を使用できますperl

perl -0777 -pe '
  s{/\* .*? \*/ | <-- .*? --> | !! .*? !!}{
    $& =~ /\n/ ? $& =~ s/[^\n]//gr : $&
  }gsex' < your-file

答え2

そうする必要がある場合は、sed次のスクリプトは例で実行する操作を実行します。

#!/usr/bin/sed -f

# if line contains "/*" we enter our "within-patterns" code-block
/\/\*/{
# however, lines must also _not_ contain "*/",
# because our specs wants us to leave those lines as is
    /\*\//!{
# first line within patterns, delete everything after the "/*"
        s%/\*.*%%
# this is a label to be used by "goto" (sed's 'b' command)
        :block
# display current line and read next one
        n
# if line just read does _not_ have "*/" end-of-block
        /\*\//!{
# delete whole line and
            s/.*//
# "goto" label "block" above
            bblock
        }
# we get here if current line _does_ contain "*/" end-of-block,
# in which case we delete everything up to the "*/"
        s%.*\*/%%
# then exit our "within-patterns" code-block.
    }
}

アプローチは、スクリプトが自動的に実行されるのではなく、「ブロック内」モードでループ制御を維持することですsed。このように、我々はブロック内のラインの動作を微調整することができます。

しかし、これは教育目的にのみ使用されているので紹介します。少しさらに進化したsed建設。このスクリプトは、実際のC / XML / HTML /すべてのソースファイルのコメント行を解析するのに完全には適していません。これらのファイルは通常、例のシナリオよりはるかに複雑なためです。たとえば、参照してください。より多くの洞察を得るには、このQ&Aをご覧ください。

関連情報