我有一个 tex 文件,其中包含形式命令的实例,\qdb{123}
其中 123 可以概括为任意长度的任意数量。我需要将这些语句转换成更复杂的东西:比如\text1{123}\text2{123}
. 这个想法是括号内的数字在新输出中被多次使用。
我需要一个 tex\newcommand
函数之外的方法(这将是一个预处理步骤)。sed 是正确的工具,如果是,那么如何?
一个简单的解决方案可能如下所示:
输入:
asldkfj aslfj ;aldfj \qdb{123} asdflk
%
\qdb{452345} somecommand \texttt{asdf}
输出:
asldkfj aslfj ;aldfj \text1{123}\text2{123} asdflk
%
\text1{452345}\text2{452345} somecommand \texttt{asdf}
通过运行(输出到控制台,用于测试):
sed -e 's/\\qdb{\([0-9]*\)}/\\text1{\1}\\text2{\1}/g' test.txt
通过运行(直接在文件上进行更改):
sed -i -e 's/\\qdb{\([0-9]*\)}/\\text1{\1}\\text2{\1}/g' test.txt
适应\\text1{\1}\\text2{\1}
您的需求。\1
是对匹配号码的反向引用。
不用说:确保有备份!
如果 ruby 可用,那么可能是这样的:
prompt> irb
>> s = "lorem \\qdb{123} ipsum \\qdb{123} lorem"
=> "lorem \\qdb{123} ipsum \\qdb{123} lorem"
>> s.gsub /\\qdb\{(\d+)\}/m, '\text1{\1}\text2{\1}'
=> "lorem \\text1{123}\\text2{123} ipsum \\text1{123}\\text2{123} lorem"
>>
反斜杠需要额外的反斜杠转义。