2

viを使用して次のことを行う方法を誰かが手伝ってくれるかどうか疑問に思っていました.

テキストファイルがあり、次のようなものが含まれている可能性があります

start of text file:
--something1.something2--
--anotherThing1.something2--
end of text file:

この行を取得し、最初に出現したコピーに一致するものを検索して変換したい場合は、最初に出現した[A-Za-z0-9]コピーの前に同じ行に追加します --

start of text file:
--something1.something2.something1--
--anotherThing1.something2.anotherThing1--
end of text file:

これを行う単一のVIコマンドはありますか?

乾杯ベン

4

4 に答える 4

5
:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/gc

または、置換ごとに確認を求めずに:

:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/g

生成されます:

--something1.something2.something1--
--anotherThing1.something2.anotherThing1--

から:

--something1.something2--
--anotherThing1.something2--

これは、'--' の後の最初の単語を最初の '.' までコピーする場合です。'.' を追加します。最後の '--' の前に見つかった単語。

vim を使用します。

再コメント:

複数の単語などがある場合は機能しないと誰かが言っていました。私は以下でそれをテストしました:

start of text file:
--something1.something2.something3.something4.something5.something6--
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5--
end of text file:

上記の式に置き換えた後:

start of text file:
--something1.something2.something3.something4.something5.something6.something1--
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5.anotherThing1--
end of text file:
于 2009-06-24T15:56:55.033 に答える
1

なんてこった、その回答を投稿するためにログインするのにかかった時間で、あなたはそれを投稿し、すでにコメントを受け取りました!

%s/--\(\w*\)\.\(.*\)--/--\1.\2.\1--/g

--ab1.cd2..yz99-- -> --ab1.cd2..yz99.ab1--

于 2009-06-24T16:02:02.897 に答える
1

これを試して:

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g
于 2009-06-24T16:06:07.000 に答える
0

stefanB のソリューションに基づいていますが、否定された文字クラスと「非常に魔法の」設定を使用して、次の置換コマンドに到達します。

:%s/\v--([^.]+)\.(.*)--/--\1.\2.\1--/

正確な要件 ("something1" および "anotherThing1" に許可されている文字) によっては、これがより正しい場合とそうでない場合があります。

考慮すべきもう 1 つの点: これまでに投稿されたすべてのソリューションでは、1 行に「--text.someOtherText--」パターンが 1 回しか出現しないと想定しています。そうでない場合、パターンの (.*) 部分は次のようになります。調整する必要があり、/g 修飾子が必要です。

于 2009-06-25T06:59:58.997 に答える