为什么 sed 在 linux 上提供“无效内容”错误,而在 mac 上不提供

Sco*_*ton 4 regex linux macos bash sed

我sed在bash脚本中有以下扩展的正则表达式替换:

sed -i.bak -E 's~^[[:blank:]]*\\iftoggle{[[:alnum:]_]+}{\\input{([[:alnum:]_\/]+)}}{}~\\input{\1}~' file.txt
Run Code Online (Sandbox Code Playgroud)

它应该替换像这样的字符串

\iftoggle{xx_yy}{\input{xx_yy/zz}}{}
Run Code Online (Sandbox Code Playgroud)

和

\input{xx_yy/zz}
Run Code Online (Sandbox Code Playgroud)

里面file.txt。

这在本地工作得很好,在OS X,但脚本需要是 POSIX。具体来说,它在我的远程Travis CI构建(使用Linux)上失败。虽然sed -E没有记录GNU sed,但它的行为就像sed -r并且似乎工作正常,允许具有扩展正则表达式的 sed 的 POSIX 版本。

给出的错误是:

sed: -e expression #1, char 81: Invalid content of \{\}
Run Code Online (Sandbox Code Playgroud)

我也不确定错误从哪里开始计算字符,是行的开头,还是仅包含在引号中的部分(表达式)?

SLe*_*ort 5

你在这里不需要 ERE。使用 BRE:

sed i.bak 's~^[[:blank:]]*\\iftoggle{[[:alnum:]_][[:alnum:]_]*}{\\input{\([[:alnum:]_\/][[:alnum:]_\/]*\)}}{}~\\input{\1}~' file.txt
Run Code Online (Sandbox Code Playgroud)

{不需要在这里逃脱,但(做。

由于+不是 BRE 的一部分,您可以替换[[:alnum:]_]+为[[:alnum:]_][[:alnum:]_]*或[[:alnum:]_]\{1,\}。

作为旁注,\+可以在 BRE 中与 GNU sed 一起使用,但请记住,它不可移植,它是 GNU 扩展。