使用sed保持参数时查找替换

时间:2012-10-14 18:28:44

标签: regex sed replace

我有一个tex文件,其中包含\qdb{123}形式的命令实例,其中123可以推广到任意长度的任意数量。我需要将这些语句转换为更复杂的语句:例如\text1{123}\text2{123}。这个想法是括号内的数字在新输出中被多次使用。

我需要一个tex \newcommand函数之外的方法(这将是一个预处理步骤)。是不是正确的工具,如果是,那么如何?

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案可能如下:

输入:

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是对匹配数字的反向引用。

不用说:确保备份!

答案 1 :(得分:0)

如果红宝石可用,那么可能是这样的:

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"
>>

反斜杠需要额外的反斜杠转义。