Regular-Expression

vi編輯器中的替換

  • December 20, 2020

我有一個名為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 \.);它會匹配任何字元。
  • 更換零件無重複;您有效地刪除了文本而不是添加。

引用自:https://unix.stackexchange.com/questions/470250