gpt4 book ai didi

regex - 为什么 sed 在 linux 上提供 "invalid content"错误但在 mac 上不提供

转载 作者:IT王子 更新时间:2023-10-29 01:20:32 28 4
gpt4 key购买 nike

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

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

应该替换像这样的字符串

\iftoggle{xx_yy}{\input{xx_yy/zz}}{}

\input{xx_yy/zz}

file.txt 中。

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

给出的错误是:

sed: -e expression #1, char 81: Invalid content of \{\}

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

最佳答案

这里不需要 ERE。使用 BRE:

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

{ 不需要在这里进行转义,但是 ( 需要。

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

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

关于regex - 为什么 sed 在 linux 上提供 "invalid content"错误但在 mac 上不提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41844377/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com