ssed(Super sed)の複数行修飾子を使用する方法は?

ssed(Super sed)の複数行修飾子を使用する方法は?

私はPerlの正規表現パターンをサポートし、sedの大幅に改良されたバージョンであるssedというツールを見つけました。https://launchpad.net/ssed/

このコマンドはうまくいかないようです:

printf 'a\nBc\n' | ssed -R 's/a(?m)\nBc\n/X\n/'

私の予想結果は次のとおりです。

X

しかし、次のように印刷されます。

a
Bc

私は複数行の処理にPerlを使用できることを知っていますが、現在はssedで利用可能なオプションを見たいと思います。

編集:これはランチパッドページから得られます:

(7) Perl-style regular expressions, with examples. Use the -R switch.
    Used in /addressing/ or the FIND side of s/// commands.

  (?i)abc - case-insensitive match of abc, ABC, aBc, ABc, etc.
  ab(?i)c - same as above; the (?i) applies throughout the pattern
  (ab(?i)c) - matches abc or abC; the outer parens make the difference!
  (?m) - multi-line pattern space: same as "s/FIND/REPL/M"

注:私はこのperlコマンドをエミュレートしようとしています。

 seq 10 | perl -p0e 's/\n/:/g'

出力:

1:2:3:4:5:6:7:8:9:10:

ベストアンサー1

ただし、一致を開始する前に、まずマルチラインパターンスペースを準備する必要があります。これはN / G / Hコマンドを介してのみ達成できます。パターン空間は、一度に1行です。

Ssedはsed変装したPerlではありませんが、Perlの正規表現機能を実装しただけです。 Perl -0peコマンドの場合、-zオプションが利用可能な場合は試してみてください。そうしないといつでも実行できます。

seq 10 |
ssed -e '
  :loop
  $!{
    N
    b loop
  }
  G
  s/\n/:/g
'
1:2:3:4:5:6:7:8:9:10:

布材:

  • N コマンドは、パターン空間に次の行を追加します。
  • ループ内でNコマンドを適用すると、すぐにすべての行がパターンスペースになり、各行は改行文字で次の行と区別されます。
  • その後、ファイルが枯渇した場合(eofに達したことを意味)、各改行文字をコロンに置き換えます。
  • Gコマンドは、予約済みスペースをパターンスペースに追加します。これは、パターン空間に改行文字を追加することを意味します。

Perl スタイルの正規表現はここに含まれていないため、-R オプションは必要ありません。しかし、パターン空間は、データ全体をパターン空間に読み込んだため、複数の行がある。これは、このパターン空間でPerlスタイルの正規表現を試すことができることを意味します。

おすすめ記事