我正在尝试使用正则expression式replacesed
文件中的一些string。 使事情复杂化,这是在一个Makefile脚本里面完成的,它需要在osx
和linux
。
具体来说,在file.tex
内我想replace
\subimport{chapters/}{xxx}
同
\subimport{chapters/}{xxx-yyy}
( xxx
和yyy
只是示例文本。)
请注意, xxx
可以包含任何字母,数字和_
(下划线),但真正的正则expression式可以简单地匹配括号内的任何东西。 有时在\subimport...
之前的行首有一些空格。
正在search的string的devise需要大量的逃避(当用正则expression式search),我猜在某处是我的错误。
以下是我迄今为止所尝试的:
sed -i'.bak' -e 's/\\subimport\{chapters\/\}\{xxx\}/\\subimport\{chapters\/\}\{xxx-yyy\}/g' file.tex # the -i'.bak' is required so SED works on OSX and Linux rm -f file.tex.bak # because of this, we have to delete the .bak files after
这会导致RE error: invalid repetition count(s)
当我构build包含此脚本的Makefile时, RE error: invalid repetition count(s)
。
我认为我的部分问题是sed
的-E
选项在sed
的osx
版本中不可用。 事实certificate,使用-E
选项时,应该逃脱的东西更less(请参阅我的问题的评论)。
POSIX-LY:
sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#'
#
用作sed
的参数分隔符(替换)
\(\\subimport{chapters/}{[[:alnum:]_]\+\)
是被捕获的组,包含所有需要的东西}
,前面有一个或多个字母,数字和下划线
在替换中,第一个捕获的组后面是所需的字符串,由}
例:
$ sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#' <<<'\subimport{chapters/}{foobar9}' \subimport{chapters/}{foobar9-yyy} $ sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#' <<<'\subimport{chapters/}{spamegg923}' \subimport{chapters/}{spamegg923-yyy}
这是最终为我工作的版本。
sed -i.bak -E 's#^([[:blank:]]*\\subimport{chapters/}{[[:alnum:]_]+)}$#\1-yyy}#' file.tex rm -f file.tex.bak
非常感谢@heemayl。 他们的答案是写得好的,只是需要一些调整才能得到一个适合我的版本。