我想替换文件中的所有方括号对,例如[some text],用\macro{some text},例如:
This is some [text].
This [line] has [some more] text.
Run Code Online (Sandbox Code Playgroud)
这变为:
This is some \macro{text}.
This \macro{line} has \macro{some more} text.
Run Code Online (Sandbox Code Playgroud)
如何用这段代码替换这些括号对?
Dav*_* W. 25
花了一点时间,但在这里:
sed -i.bkup 's/\[\([^]]*\)\]/\\macro{\1}/g' test.txt
Run Code Online (Sandbox Code Playgroud)
让我们看看我是否可以解释这个正则表达式:
\[是匹配方括号.由于[是一个有效的魔术正则表达式字符,反斜杠意味着匹配文字字符.sed我可以引用它们作为\1,\2等等.\(...\).我有[^]]*.
[^...]语法是指任何字符,但.[^]]装置中的任何字符,但一个右括号.*装置零个或多个先前的.这意味着我正在捕获零个或多个不关闭方括号的字符.\]装置中的右方括号让我们来看看[更多] [文字]
s在一些尽可能多的字符可能是不关闭方括号中.这意味着我匹配[some,但只捕获some.[some,现在我匹配最后一个结束方括号.这意味着我匹配[some].请注意,正则表达式通常是贪婪的.我将在下面解释为什么这很重要.\\macro(\1).该\1由我捕获组所取代.这\\只是一个反斜杠.因此,我将替换[some]为\macro{some}.如果可以保证每行中有一组方括号,那将会容易得多.然后我可以做到这一点:
sed -i.bkup 's/\[\(.*\)\]/\\macro(\1)/g'
Run Code Online (Sandbox Code Playgroud)
捕获组现在在方括号之间说任何东西.然而,问题是,正则表达式是贪婪的,这意味着我会从匹配s的some一路到最后t文本.下面的"x"表示捕获组.在[和]显示的方括号我匹配的:
this is [some] more [text]
[xxxxxxxxxxxxxxxx]
Run Code Online (Sandbox Code Playgroud)
这变得更加复杂,因为我必须匹配正则表达式具有特殊含义的字符,所以我们看到了很多反斜杠.另外,我不得不考虑正则表达式的贪婪,这得到了漂亮的,不匹配的字符串,[^]]*以匹配任何不是结束括号.在前后方括号中添加,\[[^]]*\]不要忘记\(...\)捕获组:\[\([^]]*\)\]你得到一个正则表达式的大混乱.
小智 11
sed -e 's/\[\([^]]*\)\]/\\macro{\1}/g' file.txt
Run Code Online (Sandbox Code Playgroud)
这将查找一个左括号,任意数量的明确非关闭括号,然后是一个右括号.该组被parens捕获并插入替换表达式中.
| 归档时间: |
|
| 查看次数: |
34803 次 |
| 最近记录: |