我正在使用包hl
中的命令soul
来突出显示。
有没有快速的方法、使用sed
或任何更好的工具来删除所有突出显示?请记住,突出显示的文本也可能包含内部括号对。例如,在以下位置运行命令:
你好 \hl{我的数学$\frac{1}{2}$} 世界
应该返回
你好,我的数学$\frac{1}{2}$世界
答案1
不是,sed
但是perl
我们需要递归正则表达式来做到这一点:
$ echo 'Hello \hl{my math $\frac{1}{2}$} world' | perl -e '
undef $/;
$_ = <>;
s/ \\hl \s* ({((?: \\. | [^{}] | (?-2) )*)}) /$2/gsx;
print;'
第 4 行的含义是:
s/ # replace
\\hl # any \hl control sequence
\s* # and some or no whitespace
( # and a TeX group (capture group #1)
{ # which consists in an opening brace
( # enclosing (capture group #2)
(?: \\. # any escaped characters
| [^{}] # or anything but braces
| (?-2) # or embedded TeX groups (recursion to #1)
)* # zero or more times
)
} # and a closing brace
)
/$2/gsx # with group #2 globally
这种方法假定您的代码解析正确,并且注释中的括号已转义或匹配。
答案2
一种方法是使用 vim。我知道这种方法对于非 vim 用户来说可能不太容易理解,但它确实有效。return、left等代表相应的键。
- 打开vim:
vim myfile.tex
- 搜索要替换的模式:
/\\hl{
return - 现在是有趣的部分:定义一个执行替换的宏:
qan4
rightv
left%
leftdv4
leftpq
- 执行一次新宏:
@a
@@
现在,你可以使用(只需按住)再次执行宏@
,或者使用类似999@
- 完成后,使用退出
:wq
return
我认为这是一个额外的好处,因为您可以检查替换的每个实例。
当然你也可以\renewcommand*{\hl}{}
,但是那不太一样。
答案3
这对我有用:
C:\Users\Name>echo Hello \hl{my math $\frac{1}{2}$} world | sed "s-\\\hl{\(.*\)}-\\1-"
Hello my math $\frac{1}{2}$ world
sed
这是Windows 上的某个版本,更具体地说:
C:\Users\Name>sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <[email protected]>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
但一般来说,这样做不行:它只是捕获表达式的最后一个括号,因此多个\hl{...}
(甚至之后的其他命令)可能会破坏它。因此,您的示例表达式(我的代码适用于该表达式)并不代表您可能想要使用它的所有用例。
这让我想起这个问题。您想要做的是找到匹配的花括号\hl{
;但即使假设您的代码解析正确,这意味着您在任何地方都不会有多余的左括号或右括号,无论是在\hl{...}
,正则表达式似乎也无法在没有递归,我不确定是否sed
支持。