2017-07-12 18 views
2

文字( '_')の前にハイフンを置き、大文字で続けて、ハイフンで置き換えたいとしました。 QWQW_IOIO、OP_FD_GF_JK、TRT_JKJなどが含まれています。Vimまたはsed:パターン内の文字を置換する

私が使ってvimの中でこれを交換しようとした: :%s/[A-Z]_[A-Z]/[A-Z]-[A-Z]/g をしかし、それはQWQ[A-Z]-[A-Z]OIOQWQW_IOIOの結果:(

私はsedコマンドを使用してみました:。 sed -i '/[A-Z]_[A-Z]/ s/_/-/g' ./file_name これは、全体のラインを超える交換が生じた例

QWQW_IOIO variable may contain '_' or '-'ラインは

QWQW-IOIO variable may contain '-' or '-'

0に置き換えられました
+0

以下の答えの「取得グルー​​プ」は、 'sed'で利用できるものと似ています(' \ v'と '\ u'のものを除く)。穏やかなイントロについてはhttp://grymoire.com/Unix/Sed.html#toc-uh-3を参照してください。がんばろう。 – shellter

答えて

5

あなたは最初のヴィムのアプローチで正しい考えを持っていました。しかし、キャプチャグループを使用して、[A-Z]セクションに見つかった文字を覚えておく必要があります。それらはきちんとhereと、:h /\1と説明されています。補足として、[A-Z]の代わりに\uを使用することをお勧めします。これは短くて高速です。

:%s/\(\u\)_\(\u\)/\1-\2/g 

それとも、あなたはそれを読みやすくするために魔法の設定を使用したい場合は:それはあなたが望む解決策があることを意味し

:%s/\v(\u)_(\u)/\1-\2/g 

別のオプションは、検索の一部を制限するだろうそれは\zs\ze原子で置き換えられます:

:%s/\u\zs_\ze\u/-/g 

は、これは私の知る最短ソリューションです。

2

これは、GNU sedと仮定して、あなたが望むことを行うはずです。

sed -i -r -e 's/([A-Z]+)_([A-Z]+)/\1-\2/g' ./file_name 

説明:

-rフラグが

[A-Z]+拡張正規表現を可能にする "は、一つ以上の大文字" 一緒

()グループパターンであり、番号記憶一致

を作成\1\2これらのメモ交換の中で一致した。

したがって、基本的に、これは大文字の別のチャンクに続くアンダー続く大文字のチャンクは、2基、

([A-Z]+)_([A-Z]+) 

としてのみ文字チャンクを記憶し、それは、これらのグループを再生見つけ、しかしと間にアンダースコアの代わりにハイフンを付けます。最後に

\1-\2 

gフラグは、パターンが1行に複数回現れる場合でも、これを行うために言います。これは、この場合離れて少し落ちること

QWQW_IOIO_ABAB 

、第2、第1の時間と一致する、ではないからです。 IOIOが最初の一致で消費されたため、2番目の部分は一致しません。だから

QWQW-IOIO_ABAB 

ことになる。このバージョンは+をドロップするので、それは一つだけ大文字に一致し、同じように中断されません。

sed -i -r -e 's/([A-Z])_([A-Z])/\1-\2/g' 

それはまだ小さな欠陥を持っている場合など次のような文字列があります。

A_B_C 

同じ問題が複数の代わりになりました。

関連する問題