使用sed和正则expression式replaceOSX和Linux上的文本

我正在尝试使用正则expression式replacesed文件中的一些string。 使事情复杂化,这是在一个Makefile脚本里面完成的,它需要在osxlinux

具体来说,在file.tex内我想replace

 \subimport{chapters/}{xxx} 

 \subimport{chapters/}{xxx-yyy} 

xxxyyy只是示例文本。)

请注意, 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选项在sedosx版本中不可用。 事实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。 他们的答案是写得好的,只是需要一些调整才能得到一个适合我的版本。