用Awk

时间:2018-08-29 22:04:31

标签: awk

如何获取这样的字符串:

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

3 个答案:

答案 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]是穷人对Tt不区分大小写的匹配项;通过使用捕获组保留该案例。