regsub ?switches? exp string subSpec ?varName?
1.使用方法
这条命令的用法是:在string中匹配到exp后,用subSpec将exp替换掉,并把替换后形成新的string赋值给varName,如果没有定义varName,那么会将其直接打印到屏幕上。
icc2_shell> regsub ab abcde xx newname
1
icc2_shell> echo $newname
xxcde
icc2_shell> regsub ab abcde xx
xxcde
这里ab被替换成了xx
如果subSpec中包含“&”或者“\0”,表示将所匹配到的内容赋值于“&”或者“\0”,这里\&和\0都表示匹配到的ab,xx\&和xx\0表示 xxab
icc2_shell> regsub ab abcde xx\&
xxabcde
icc2_shell> regsub ab abcde xx\\0
xxabcde
如果subSpec中包含\1-9,那么使用string中与exp第n个括号匹配的字符串进行替换:
icc2_shell> regsub (.+)aa(.+)qq avaa/bbs/qqa xx\\1
xxava
icc2_shell> regsub (.+)aa(.+)qq avaa/bbs/qqa xx\\2
xx/bbs/a
这里的\1 表示第一个(.+)匹配到的内容,即av , xx\\1 = xxav, 而(.+)aa(.+)qq匹配到的内容是avaa/bbs/qq,被替换成xxav , 所以最终的结果是xxava。\2表示第二个(.+)匹配到的内容,即/bbs/,所以结果是xx/bbs/a。
2.Option
switches代表能够使用的option,内容如下:
-all
表示找到所有与exp匹配的字符串并对每个匹配项进行替换。如果不打开这个开关,那么就会对找到的第一个进行替换
icc2_shell> regsub ab (ab)(ab)(ab)cd xx
(xx)(ab)(ab)cd
icc2_shell> regsub -all ab (ab)(ab)(ab)cd xx
(xx)(xx)(xx)cd
-expanded
打开这个选项后 exp中的空格和注释将会被忽略
regsub "a b" (ab)(ab)(ab)cd xx
(ab)(ab)(ab)cd
regsub -expanded "a b" (ab)(ab)(ab)cd xx
(xx)(ab)(ab)cd
第一行命令没有加-expanded , 在(ab)(ab)(ab)cd中没有匹配到任何“a b”的字符串,所以操作结果没有任何变化。第4行增加了-expanded , “a b”之间的空格被忽略变成了ab, 所以第一个ab被替换成了xx。
-line
开启行敏感匹配,此选项相当于同时指定-linestop和-lineanchor。默认情况下在string中的换行符(\n)是一个完全普通的字符串,没有任何含义。可以被exp匹配到:
icc2_shell> regsub a.+b aabb\nbAB\nc xx
xxAB
c
字符串中的第一个换行符被匹配和替换(如果没有被替换应该输出三行)。当打开-line选项后,匹配机制能够识别换行符,且换行符不会被替换掉。
icc2_shell> regsub -line a.+b aabb\nbAB\nc xx
xx
bAB
c
-linestop
改变括号表达式的行为,识别换行符,每个括号表达式单独执行
icc2_shell> regsub a.*c$ abc\nabc\nabc xxx
xxx
默认情况下会\n会被匹配到,导致整个字符串都被替换成xxx
icc2_shell> regsub -linestop a.*c$ abc\nabc\nabc xxx
abc
abc
xxx
当增加了-linestop后,能够识别换行符,且匹配替换机制在最后一个换行符前结束。
-lineanchor
改变与(and)的行为,不识别换行符(单独执行貌似没有什么效果)
icc2_shell> regsub -lineanchor a.*c$ abc\nabc\nabc xxx
xxx
但是当-linestop 与 -lineanchor同时应用时 与 -line效果一致
icc2_shell> regsub -lineanchor -linestop a.*c$ abc\nabc\nabc xxx
xxx
abc
abc
icc2_shell> regsub -line a.*c$ abc\nabc\nabc xxx
xxx
abc
abc
-nocase
忽略大小写
--
表示option结束,后面的参数将被视为exp,即便有-开头。下面的例子中--后的-all被当作exp
icc2_shell> regsub -nocase -- -all (ab)(-all)cd xx
(ab)(xx)cd