1

最終的な目的は、^NULL^ のすべてのインスタンスを ^^ に置き換えることです。この質問では、読みやすくするために、^NULL^ を ^fred^ に置き換えてみます。これが私のテストデータです。

/usr/redbrick_dir $ cat temp
a^NULL^b^c^
e^NULL^NULL^f^
g^h^i^NULL^

これが私が期待していることです。

/usr/redbrick_dir $ cat temp | sed "s/\^NULL\^/\^fred\^/g"
a^fred^b^c^
e^fred^NULL^f^
g^h^i^fred^

2 行目では、^NULL^ の最初のインスタンスのみが置換されていることに注意してください。ただし、区切り文字を 1 つだけ指定してコマンドを実行すると、

/usr/redbrick_dir $ cat temp | sed "s/NULL\^/fred\^/g"
a^fred^b^c^
e^fred^fred^f^
g^h^i^fred^

望ましい結果が得られます。末尾の区切り記号のみを使用すると、これらの結果も得られます。問題は、このコマンドが ^NULL^ の最初のインスタンスのみを置き換えるのはなぜですか?

cat temp | sed "s/\^NULL\^/\^fred\^/g"

ここから編集開始

以下に投稿されたいくつかの回答を試したときに何が起こったのかを次に示します。

cat temp | sed "s/(?<=\^)NULL(?=\^)/fred/g"
a^NULL^b^c^
e^NULL^NULL^f^
g^h^i^NULL^

cat temp | sed ":a s/\^NULL^/^fred^/;ta"
sed: 0602-417 The label :a s/\^NULL^/^fred^/;ta is greater than eight characters.

Utopik が提供するリンクを確認する必要があります。

4

3 に答える 3

2

このコマンドが ^NULL^ の最初のインスタンスのみを置き換えるのはなぜですか?

式は 2 行目の 2 番目と一致しないため、式が^NULL^最初の を検出した後、^NULL^の直後の文字で一致を検出しようとします^

e^NULL^ NULL^f^
       ^
   it is now trying to find a match here but there is no ^NULL^ here, there is NULL^ only.

正規表現101のデモ

sedが後読みまたは先読みをサポートしているかどうかはわかりませんが、サポートされている場合は、次のように置き換えます。

cat temp | sed "s/(?<=\^)NULL(?=\^)/fred/g"

fredまたはあなたの場合、もちろん空の文字列に置き換えてください。

于 2013-09-07T12:12:59.030 に答える