Regular-Expression
vi編輯器中的替換
我有一個名為
foo.txt
. 此文件包含值:abc.tar.gz abc.1.1.tar.gz bca-1.2.tar.gz
我想得到這樣的輸出
abc abc.tar.gz abc.1.1 abc.1.1.tar.gz bca-1.2 bca-1.2.tar.gz
相同的值/文本必須出現在原始值/文本之前。如何使用正則表達式來實現這一點?
%s/^[a-z_-]*./\1/g
我使用了上面的表達式,但我得到了錯誤的輸出。
擷取組
:help /\(
可讓您儲存與內部模式匹配的內容\(...\)
;然後,您可以在替換中(甚至在模式本身之後)引用匹配項(通過\1
第一組,\2
等等)。解決您的問題的一種方法(有很多)是在
.tar.gz
副檔名之前擷取文件名。在替換中,放置擷取(\1
)、一個空格,然後是原始文本(\0
,或&
)::%substitute/\(.*\)\.tar\.gz$/\1 &/
或者,您可以只匹配副檔名之前的內容(以 結束匹配
\ze
),然後複製::%substitute/.*\ze\.tar\.gz$/& &/
您的嘗試有問題
- 您使用了 backreference
\1
,但從未擷取任何內容。- 與
[a-z_-]
文字不匹配.
,但這齣現在您的範例中。- 沒有逃脫決賽
.
(as\.
);它會匹配任何字元。- 更換零件無重複;您有效地刪除了文本而不是添加。