2つの単語を逆転させるためにSed


8
echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\) \(.*\)/ \2 \1/'

私が期待している出力はです/usr/local/Axis2C AXIS2C_HOME=。

私は自分が間違っていることを理解できません。:(

回答:


8

簡単な答えは、「バックスラッシュを増やし、スペースを減らす」です。

echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

しかし、より広い答えは、「待って、あなたは何をしようとしているのですか?」です。キーと値のペアを有用な変数に分割しますか、それとも実際に入力をリバース構文に変換して別の何かにフィードしようとしていますか?


1

の後に誤ったスペースがあり=ます。試してください:

sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

以下も機能し、少し短くなります。\1最初の前に何でも/

sed 's|^\([^/]*\)\(/.*\)|\2 \1|'

0

Sedは素晴らしいですが、Perlもこれを行うことができ、バックスラッシュのフォレストを必要としません。

% echo "AXIS2C_HOME=/usr/local/Axis2C" | perl -pe 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
/usr/local/Axis2C AXIS2C_HOME=

さらに、正規表現エンジンの能力を最大限に活用できるため、さらに複雑なパターンを実行できます。


2
あなたが持っている場合も、バックスラッシュの森を避けることができsed、そのようなをGNUがサポートする正規表現を拡張することをsedのよう:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
— スティーブン・D

@Steven D:森は私の友達です...(クマのしゃれ半分は意図したものです...残りの半分は:私はそれらがなければ失われると思います:) ...しかし、私はそれを検討しています-r ...について言及しました(私はそれについて考えました..バックスラッシュを使い続けます。そうしないと、他のすべてのsedステートメントを理解できなくなります:)
— Peter.O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.