Sed

在 sed 或 perl 中是否有 vim 的 zs 等價物?

  • December 29, 2016

在 vim 中,我們可以使用\zsatom 來表示“真正開始比賽”:

:%s/funnyword\zs.*$/otherword/

是否有 sed 甚至 perl 的等價物?

在 Perl(和 PCRE)中,這可以通過零寬度後視來實現:

(?<=funnyword).*$

匹配“funnyword”,但不將其作為匹配的一部分使用。這些僅適用於後視中的固定長度文本。您還可以使用否定的lookbehinds ( (?<!...)) 來指定某些文本不存在。

在任何相當新的 Perl 版本中,\K幾乎可以完全替代\zs您使用它:

funnyword\K.*$

\K丟棄到目前為止匹配的所有內容,但從那時起繼續匹配。之前的部分\K不必是固定長度的。這也在 PCRE 現在,但我不確定它是什麼版本。

\ze可以通過零寬度前瞻來實現,使用(?=...). 該模式不需要是固定長度的。


因為 sed 使用POSIX BRE所以沒有環視。但是,在這種情況下,您可以使用普通的擷取組相當容易地模擬它:

sed -e 's/\(funnyword\).*$/\1otherword/'

您可以對積極的前瞻執行相同的操作。如果你真的有更複雜的需求,你可能不得不尋找 Perl 或其他一些方法。

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