Sed
在 sed 或 perl 中是否有 vim 的 zs 等價物?
在 vim 中,我們可以使用
\zs
atom 來表示“真正開始比賽”::%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 或其他一些方法。