5

ファイル内のいくつかの数値を、見つかった数値を使用した計算結果に置き換え、MacOSXでsedを使用したいと思います。私は多くのバリエーションを試しましたが、基本的な正規表現の代わりにモダンを使用するには-Eを使用する必要があることがわかりました。

いくつかの例:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed s/\ +\ wwv_flow_id.offset/blabla/

与える

bla 18934750blabla bla

したがって、-Eがないと、固定テキストが検索されて置き換えられます。しかし、-Eを使用すると、次のことはできません。

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ +\ wwv_flow_id.offset/blabla/

与える

bla 18934750 + wwv_flow_id.offset bla

言い換えれば、テキストに一致や変更はありません。最終的な目標は、固定テキスト「+ wwv_flow_id.offset」の前にある番号を見つけ、その番号を使用して、そこから固定番号(たとえば、750)を引くことです。したがって、最終結果は次のようになります。

bla 18934000 + wwv_flow_id.offset bla

そのためには、少なくとも後方参照が必要ですが、これも期待どおりに機能しません。

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\1/

与える

bla 1+ wwv_flow_id.offset bla

正規表現の第一人者がここで私を助けてくれることを願っています。


アップデート

ruakhの助けを借りて、これは私が今持っているものです:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) \+ wwv_flow_id.offset/(\1-750) \+ wwv_flow_id.offset/'

これは次を返します:

bla (18934750-750) + wwv_flow_id.offset bla

今のボーナスの質問は、これをどのように変えるかです

bla 18934000 + wwv_flow_id.offset bla




更新2

次のように、sedとawkを組み合わせることで、目的の結果を達成することができました。

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+)([ ]*)\+([ ]*)wwv_flow_id.offset/~\1~\2\+\3wwv_flow_id.offset/' | awk -F~ '{print $1 $2-750 $3}'

~(元の行にトークンがないことは確かです)

4

1 に答える 1

8

「モダン」正規表現で+は、特別な意味があります—「1つ以上」を意味します(*「ゼロ以上」を意味するのと同じように)—実際のプラス記号と一致させるには、を使用する必要があります\+sed-scriptを引用符で囲まない方がよいようですので、次のように記述し\\+ます。

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ \\+\ wwv_flow_id.offset/blabla/

あなたがその好みを捨てて、書くならば、それはあなたの人生を楽にするだろうと私は思いますが:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/ \+ wwv_flow_id.offset/blabla/'

あなたの議論を引用することはあなたの後方参照の問題にも対処します、それによってBashは次のように翻訳\1してい1ます:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) /\1/'

ただし、引用符で囲まれていないスクリプトsedスタイルを使い続ける場合は、次のように記述できます\\1

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\\1/
于 2012-09-30T14:39:55.120 に答える