使用sed和regex替换OSX和Linux上的文本

时间:2017-01-22 05:03:24

标签: regex linux macos sed makefile

我正在尝试使用正则表达式用sed替换文件中的一些字符串。为了使问题复杂化,这是在Makefile脚本中完成的,该脚本需要同时适用于osxlinux

具体来说,在file.tex我要替换

\subimport{chapters/}{xxx}

\subimport{chapters/}{xxx-yyy}

xxxyyy只是示例文字。)

注意,xxx可以包含任何字母,数字和_(下划线),但实际上正则表达式可以简单地匹配括号内的任何内容。有时在\subimport...之前的行的开头有一些空格。

正在搜索的字符串的设计需要大量的转义(当使用正则表达式进行搜索时),我猜测其中某处是我的错误。

这是我到目前为止所尝试的内容:

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

当我构建包含此脚本的Makefile时,这会导致RE error: invalid repetition count(s)错误。

我认为我的问题的部分原因是-Esedosxsed -E选项无效。事实证明,使用syms x y z r = x^2 + y^2 + z^2; f = matlabFunction(log(r)+r^(-1/2),'File','myfile'); 选项时,应该转义的内容较少(请参阅我的问题评论)。

2 个答案:

答案 0 :(得分:1)

POSIX-LY:

if(num%3===0)
  • sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#' 用作# sed的{​​{1}}的参数分隔符(替换)

  • s是捕获的组,包含最后\(\\subimport{chapters/}{[[:alnum:]_]\+\)所需的所有内容,前面有一个或多个字母,数字和下划线

  • 在替换中,第一个捕获的组后跟所需的字符串,由}

  • 关闭

示例:

}

答案 1 :(得分:0)

这是最终为我工作的版本。

sed -i.bak -E 's#^([[:blank:]]*\\subimport{chapters/}{[[:alnum:]_]+)}$#\1-yyy}#' file.tex
rm -f file.tex.bak

非常感谢@heemayl。他们的回答是写得更好,只需要进行一些调整就可以得到适合我的版本。