Sed
為什麼帶有${ 的正則表達式適用於 egrep,但不適用於 sed?
給定這樣的文字
./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 至少與行數一樣大。)