如何获取这样的字符串:
sample="+TEST/TEST01/filetest01.txt"
用test01/TEST01
替换所有出现的test02/TEST02
,并保持文本大小写不变。因此,所需的输出将是:
"+TEST/TEST02/filetest02.txt"
如果要传递TEST03的替换字符串。那么所需的输出将是
"+TEST/TEST03/filetest03.txt"
如果替换文本为Test04。所需的输出:
"+TEST/TEST04/filetest04.txt"
我已经尝试过:
echo "$sample" | awk 'BEGIN{IGNORECASE=1}{gsub("test01", "test02");print}'
它将替换小写字母值,而不是大写字母。
我无法使用sed,因为我所拥有的版本不支持/I
开关来忽略大小写。
我的最终目标是能够使用代表要更改项目的变量。因此变量将如下所示:
text2replace=test01
replacetext=test02
答案 0 :(得分:1)
使用gnu-awk:gawk
:
echo "$sample" | awk 'BEGIN{IGNORECASE=1}{print gensub("test01", "test02", "g")}'
+TEST/test02/filetest02.txt
echo "$sample" |
tr '[[:upper:]]' '[[:lower:]]' |
awk '{gsub("test01", "test02");print}'
答案 1 :(得分:1)
perl对此很有帮助
$ perl -pe 's/test\K01/02/ig' <<< "+TEST/TEST01/filetest01.txt"
+TEST/TEST02/filetest02.txt
\K
指令指示regex引擎匹配其左侧的内容,然后将其忽略。仅当在“测试”之后才将“光标”定位到“ 01”的开头。
我还将i
标志用于不区分大小写的匹配。
更一般而言,如果您希望以不区分大小写的方式(“零填充”相同的数字)递增“测试”后的数字:
perl -pe 's/test\K(\d+)/ sprintf "%0*d", length($1), $1+1 /eig' <<INPUT
+TEST/TEST01234/filetest00009.txt
INPUT
+TEST/TEST01235/filetest00010.txt
答案 2 :(得分:1)
您说您的GNU sed没有I
标志,但是您可以使用POSIX sed来实现:
$ sed 's/\([Tt][Ee][Ss][Tt]0\)1/\12/g' <<< '+TEST/TEST01/filetest01.txt'
+TEST/TEST02/filetest02.txt
[Tt]
是穷人对T
或t
不区分大小写的匹配项;通过使用捕获组保留该案例。