Sed

為什麼帶有${ 的正則表達式適用於 egrep,但不適用於 sed?

  • January 28, 2015

給定這樣的文字

./RFF_09 -f${FILE} -c${COND}

在文件中,此 egrep 命令將正確匹配:

egrep './RFF(.*) (.*)-c\\$\{COND\}' file

但是這個 sed 命令不會

sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':./RFF$1 $2-cRFF$1:gp"

它會失敗sed: -e expression #1, char 38: invalid content of \{\}。我也試過

sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp" file
sed -n s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp file

結果相同。

sed -n "s:'./RFF(.*) (.*)-c\\$\\{COND\\}':DUMMY:gp" file

不會給我錯誤資訊,但不會匹配。

我究竟做錯了什麼?或者更好:如何替換原始命令建議的文本?我使用的是相當舊的 sed (4.1.2) 和 egrep (2.5.1) 版本,因此即使您無法使用較新版本重現錯誤,也可以使用解決方法。

如果您使用e grep 表示 grep 具有擴展的正則表達式語法,以便能夠將您的模式轉移到 sed 中,您必須添加參數-r(--regexp-extended)-E在某些版本中。

關於你的表達,你有額外的\c所以即使使用 egrep 它也不匹配

此外,您可以更好地使用\1反向$1匹配。

所以最終的命令可能是:

sed -rn 's:\./(RFF.*)( .* -c)\$\{COND\}:./\1\2\1:gp'

或者

sed -rn 's:(\./(RFF\S*) \S* -c)\$\{COND\}:\1\2:gp'

在您的原始陳述中,問題在於您混合了句法和文字引號:雙引號中的單引號將按字面意思匹配。您將想要簡單地刪除它們或混合引號(而不是嵌套它們)。未經測試的例子:

sed 's/foo/{bar}/'
sed "s/foo/"'{bar}'"/"

正則表達式有很多種風格,它們都支持不同的語法。在僅使用單引號的嘗試中,問題是正則表達式風格:sed用於\{N\}匹配計數,因此N需要是整數。你會想改用{COND}.

(確實,現在使用正則表達式解決問題意味著您有兩個問題。在 shell 程式碼中做幾乎任何復雜的事情都意味著您有 N 個問題,N 至少與行數一樣大。)

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