我正在尝试使用正则表达式用sed
替换文件中的一些字符串。为了使问题复杂化,这是在Makefile脚本中完成的,该脚本需要同时适用于osx
和linux
。
具体来说,在file.tex
我要替换
\subimport{chapters/}{xxx}
与
\subimport{chapters/}{xxx-yyy}
(xxx
和yyy
只是示例文字。)
注意,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)
错误。
我认为我的问题的部分原因是-E
版sed
版osx
版sed
-E
选项无效。事实证明,使用syms x y z
r = x^2 + y^2 + z^2;
f = matlabFunction(log(r)+r^(-1/2),'File','myfile');
选项时,应该转义的内容较少(请参阅我的问题评论)。
答案 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。他们的回答是写得更好,只需要进行一些调整就可以得到适合我的版本。