`sed` 命令用于删除文本中的突出显示

`sed` 命令用于删除文本中的突出显示

我正在使用包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 用户来说可能不太容易理解,但它确实有效。returnleft等代表相应的键。

  1. 打开vim:vim myfile.tex
  2. 搜索要替换的模式:/\\hl{return
  3. 现在是有趣的部分:定义一个执行替换的宏:qan4rightvleft%leftdv4leftpq
  4. 执行一次新宏:@a
  5. @@现在,你可以使用(只需按住)再次执行宏@,或者使用类似999@
  6. 完成后,使用退出:wqreturn

我认为这是一个额外的好处,因为您可以检查替换的每个实例。

当然你也可以\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支持。

相关内容