
私は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スタイルの正規表現を試すことができることを意味します。