在TCL的Regexp麻烦

时间:2012-07-20 09:52:35

标签: regex shell tcl

我对TCL中的regexp有疑问 如何使用regexp函数在TCL字符串变量中查找和更改some text 文字示例: /folder/folder2/test-c+a+t -test1 -test2
我想收到: /folder/folder2/test-d+o+g

或者例如它可以只是:
test-c+a+t
我想收到:
test-d+o+g

对不起这个补充:
在这种情况下:
/test-c+a+t/folder2/test-c+a+t -test1 -test2
我想收到:
/test-c+a+t/folder2/test-d+o+g -test1 -test2

3 个答案:

答案 0 :(得分:3)

% set old {/folder/folder2/test-c+a+t -test1 -test2}
/folder/folder2/test-c+a+t -test1 -test2
% set new [regsub {(test)-c\+a\+t.*} $old {\1-d+o+g}]
/folder/folder2/test-d+o+g

请注意,文字+符号需要转义,因为它们是正则表达式量词。

http://tcl.tk/man/tcl8.5/TclCmd/re_syntax.htm
http://tcl.tk/man/tcl8.5/TclCmd/regsub.htm

答案 1 :(得分:3)

在这里你提到的具体情况中,你最好使用字符串映射。正则表达式更灵活,但这完全取决于您的任务的具体程度。

set modified [string map {test-c+a+t test-d+o+g} $original]

否则,学习如何使用正则表达式语法是无可替代的。它几乎一直很有用,因此请阅读手册页,尝试各种表达式,并在不符合预期时重新阅读本手册。还可以尝试使用sed,awk和grep学习使用regexp。

答案 2 :(得分:0)

使用string map或使用regsub(可能使用-all标记)。以下是两种方法的一些示例:

set myString [string map [list "test-c+a+t" "test-d+o+g"] $myString]
set myString [regsub -all "***=test-c+a+t" $myString "test-d+o+g"]
### Or equivalently, for older Tcl versions...
regsub -all "***=test-c+a+t" $myString "test-d+o+g" myString

string map可以在一次扫描中应用多项更改(地图a b b a会交换所有ab个字符),但永远取代文字字符串,并始终取代它所能做的一切。 regsub命令可以执行更复杂的转换,并且可以更加选择性地替换它,但是它确实需要使用正则表达式,而string map可以执行等效操作时速度较慢工作。但是,模式中的特殊前导***=表示模式的其余部分是文字字符串。