Sed

如何用sed搜尋和替換,但在第一個匹配組之後有一個數字(匹配組的正確轉義)

  • September 6, 2022

前言

也許你想轉換這個:

aaaa

至:

1aaa1

所以讓我們提出這個建議:

echo aaaa | sed --regexp-extended 's/(.*)a/1\11/'
→
1aaa1

問題

1\11100% 有效的明確sed模式嗎?我是否遵守了sed這種替換的所有良好做法?

我的意思是1\11 可能是這兩個:

  1. 替換為 char 1,然後是 1° 匹配組,然後是另一個 char 1(→ 目前行為)
  2. 替換為 char 1,然後是11 ° 匹配組(→ 導致異常)

目前看來我的 sed 版本有第一個解釋。無論如何,我不知道這是否已記錄在案,或者是否可以在sed.

謝謝你的澄清。同時,我不會在此基礎上建造城堡。

目前我正在使用 GNU sed 4.7。

POSIX 中有這樣一段描述

反向引用表達式 ‘\n’ 應匹配與在 ‘\n’ 之前的 “(” 和 “)” 之間包含的子表達式匹配的相同(可能為空)字元串。字元 ’n’ 應該是一個從 1 到 9 的數字,指定第 n 個子表達式(以模式開頭的第 n 個 “(” 開始並以相應的成對 “)” 結束的子表達式)。

這將避免任何\10or \11

這是 BRE 的語法,但我們不需要擔心 POSIX 中的 ERE,因為它們不允許反向引用。

GNU sed 手冊也是如此。我不相信有任何 sed 允許的不僅僅是\1...\9反向引用。

一種允許更多反向引用的語言是 Perl。但是在那種語言中,會寫入多於一位的反向引用${23}。我想這樣的規定或類似規定通常用於避免混淆。

正如使用者@QuartzCristal 所說,在 GNU 的sed手冊頁中有這樣的註釋:

s/正則表達式/替換/

嘗試將正則表達式與模式空間進行匹配。如果成功,則替換與替換匹配的部分。替換可能包含特殊字元 & 來引用匹配的模式空間部分,特殊轉義符 \1 到 \9 來引用正則表達式中相應的匹配子表達式。

來自沒有這種限制的通用程式語言(如 Perl)19例如,您可以編寫1{$19}1),我不知道sed. 所以,我知道目前語法只是 100% 正確,不能以其他方式解釋。

這個答案對 GNU sed 有效。不確定這是 POSIX 定義。

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