5

<>、##、または || で区切られたグループを含むテキストの本文があります。ブロックが重なることはありませんが、次のように複数の行にまたがることがあります。

#A fully emphasized line#
A line with #emphasis inside#.
#Several lines of
text
With emphasis#
no emphasis
Line #with# multiple #emphasis#.
Line <with some > |text of| #each type#.

区切り文字の各ペアを [ と ] に置き換え、最後の区切り文字を ] の後に置こうとしています。たとえば、最後の行次のようになります。

Line [with some ]> [text of]| [each type]#.

最初の部分を実行する sed スクリプトを作成しました。

sed -e ':left s/[#|<]/[/; t right; n; b left :right s/[#|>]/]/; t left;n; b right'

しかし、 & (または (..) + \1) を使用して文字を次のように戻そうとすると:

sed -e ':left s/[#|<]/[/; t right; n; b left :right s/[#|>]/]&/; t left;n; b right'

私は以下を取得します:

[A fully emphasized line][
A line with ][emphasis inside][.
][Several lines of
text
With emphasis][
no emphasis
Line ][with][ multiple ][emphasis][.
Line [with some ]]]]]]> [text of[ [each type[.

ただし、ここで何が問題になったのかはわかりません-何らかの方法でパターンブロックを台無しにしているようです. これを 3 つの呼び出し (マッチ タイプごとに 1 つをハードコーディング) に置き換えることもできますが、それは過剰に思えます。

4

1 に答える 1

4

Try following command. It reads the whole file in memory and do global substitutions for each pair of delimiters:

sed -e '
    :a
    $! { N; ba };
    s/#\([^#]*\)#/[\1]#/g; 
    s/<\([^>]*\)>/[\1]>/g; 
    s/|\([^|]*\)|/[\1]|/g
' infile

It yields:

[A fully emphasized line]#
A line with [emphasis inside]#.
[Several lines of
text
With emphasis]#
no emphasis
Line [with]# multiple [emphasis]#.
Line [with some ]> [text of]| [each type]#.
于 2013-07-18T16:48:35.957 に答える