如何用sed替换行首文本?Windows下^行首锚点失效问题求解
sed行首锚点
^匹配失败问题解决 根本原因
你的问题核心是sed默认的行首锚点^的匹配规则:
- sed默认按行读入文件时,模式空间内不会包含换行符,
^仅匹配模式空间的最开始位置 - 你先用
fart将所有换行替换为NEWLINE字符串,整个文件变为单行内容读入sed - 第一个替换命令插入的
\n是在模式空间内部插入的换行,默认情况下^不会识别这些\n后面的位置为行首,所以^NEWLINE永远匹配不到(只有整个文件最开头的位置会被^匹配,而你的文件开头是1. (b)不是NEWLINE)
解决方案
给用到行首锚点^的替换规则增加**多行模式标志m**即可,开启后^会匹配模式空间内所有换行符后的位置,对应逻辑行的行首。
修改你的preprocess_answers.sed文件如下:
#usage: sed -i -E -f preprocess_answers.sed filename.tex s|(NEWLINE *[0-9]+\. *)|\n\1|g s|Hint|\tHint|g # 取消注释并在末尾加m标志 s|^NEWLINE([^\r\n\t]+)|\\begin{finalanswer} \1 \\end{finalanswer}|gm # 调试用的行也加m标志 s|^NEWLINE|XYZ|gm s|\t(Hint[^\r\n]+)|\t\\begin{hint} \1 \\end{hint}|g
如果当前Windows环境安装的GnuWin32版本sed不识别m标志,换用msys2/mingw提供的sed版本即可兼容。
内容的提问来源于stack exchange,提问作者claws
相关产品推荐
相关产品推荐

