我编写了以下 sed 代码,但我还没有找到使其工作的方法......
sed -is 's/documentclass\{standalone\}/documentclass\[class\=memoir\]\{standalone\}/gp' *.tex
我是否以错误的方式使用转义序列?以下是返回的错误:
sed: -e expression #1, char 76: Invalid content of \{\}
答案1
在 BRE(基本正则表达式)模式(即没有-E
or-r
命令行选项)中,大括号并不特殊,而转义大括号用于量词,例如\{1,3\}
.错误消息是因为standalone
无法解析为数字量词。所以你要{standalone}
:
$ printf '%s\n' 'documentclass{standalone}' | sed 's/documentclass{standalone}/documentclass[class=memoir]{standalone}/gp'
documentclass[class=memoir]{standalone}
documentclass[class=memoir]{standalone}
或者保留转义大括号,但使用 ERE(扩展正则表达式)模式:
$ printf '%s\n' 'documentclass{standalone}' | sed -r 's/documentclass\{standalone\}/documentclass[class=memoir]{standalone}/gp'
documentclass[class=memoir]{standalone}
documentclass[class=memoir]{standalone}
请注意,无论哪种情况,RHS 中的任何内容都不需要转义。
也可以看看:
另请注意,至少在 GNU sed 中,-is
将就地编辑文件,创建后缀为 的备份文件s
。如果您想传递-i
和-s
选项,则必须单独执行或按其他顺序执行-si
。然而 iirc-i
意味着-s
后者可能是多余的。