2

私はこの問題を抱えています:

入力テキスト:

this is my text text text and more text
this is my text myspace this is my text
this space is my text space this is my
this is my text this is my text
this space is my text space space myspace

「スペース」を検索したいとしましょう
。これを出力として使用したいと思います。

this is my text text text and more text
space
space space
this is my text this is my text
space space space space

同じ行の一致は、スペースで区切る必要があります。
一致しない行はそのままにしておく必要があります。

他のすべての検索項目についても同様です。

今日の午後、これを実現しようとしていますが、成功していません。
誰でも私を助けることができますか?

4

3 に答える 3

3

解決:

:g/space/s/\(.*space\).*$/\1/|s/.\{-}space/ space/g|s/^ //

説明:

これはトリッキーですが、実行できます。ただし、単一の正規表現では実行できません。

最初に行うことは、最後の一致の後に何かを取り除くことです (ここでは、正規表現がデフォルトで貪欲であるという事実を実際に利用しています)。

s/\(.*space\).*$/\1/

次に、すべての内部一致の間にあるものをすべて削除します (*ここでは遅延バージョンを使用していることに注意してください\{-})。

s/.\{-}space/ space/g

前のステップでは、結果に最初のスペースが残るため、それを取り除きます。

s/^ //

|幸いなことに、vim では、置換を文字と一緒に連鎖させることができます。したがって、すべてをまとめると、次のようになります。

:g/space/s/\(.*space\).*$/\1/|s/.\{-}space/ space/g|s/^ //
于 2013-07-05T20:52:57.943 に答える
3

このトリッキーなセリフは大丈夫ですか?

:g/space/s/space/^G/g|s/[^^G]//g|s/^G/space /g

^G上記を押す必要がありますCtrl-V Ctrl-G

上記のコマンドの出力は、パターンの後の最後の空白(この場合はスペース)を除いて、例と同じです。しかし、修正するのは簡単です。たとえば、ラインのs/ $//後に別のチェーンを付けます。:g

于 2013-07-05T20:46:31.913 に答える