特定の範囲内の文字列のみを置き換える

特定の範囲内の文字列のみを置き換える

仕様にファイル内の文字列を置き換える方法は?存在する3. 特定のコンテキストで文字列が見つかった場合のみ置換、次の構造を使用してパイプをファイルの空白に置き換えることを実装しようとしています。

12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]

私はこれが必要です:

12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]

パスワード:

echo "12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]" | \
 sed 's/\(START.*\)\|/ \1/g'

どんなアイデアがありますか?

ベストアンサー1

コマンドの問題は、gフラグが設定されている場合でも、一致させるテキストの特定の部分を内に含めることができるだけです。一つマッチ。貪欲になると、.*最終的に最後のパイプ文字だけが削除されます。代替テキストの空白が間違った場所にあることは言うまでもありません。

s一致するものがなくなるまで、ループ内でコマンドを繰り返すことでこれを行うことができます。このように:

sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;t looplabel'

または、より短いループラベルを使用してください。

sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;tt'

おすすめ記事