我试图通过用几个字符(两个*(替换几个相同的字母(超过3个(来转换文本。
我的输入:
ffffOOOOuuuurrrr
fffffiiiiivvvvveeeee
我应该得到什么:
**OOOO****
********
我的测试命令是:
awk '{gsub(/[a-z]{4}/,"*"); print}' textfile
我不明白如何将{4}
转换为"大于3"。
还有如何将*
打印两次(如相乘(。
我也确信条件"三个以上"会将输入转换为:
**OOOO**
**
有没有办法避免这种情况(替换一系列相同的字母(?
或者它不可能适应一个小命令。
POSIX awk或sed不支持反向引用。您需要使用gnu-sed
或perl
:
sed -E 's/([a-z])1{3,}/**/g' file
**OOOO****
********
或使用perl
:
perl -pe 's/([a-z])1{3,}/**/g' file
RegEx详细信息:
([a-z])
:匹配[a-z]
并在组#1中捕获1
:第1组中捕获的信件的背面参考{3,}
:重复3次或以上
您在标签中提到sed
作为选项:
echo "fffffiiiiivvvvveeeee" | sed 's/([A-Za-z])111+/1/g'
five
echo "fffffiiiiivvveeeee" | sed 's/([A-Za-z])111+/1/g'
fivvve
以下是如何使用任何awk,假设区域设置的小写字母为a-z=ASCII 97-122:
$ cat tst.awk
{
for (i=97; i<122; i++) {
gsub(sprintf("%c{3,}",i),"**")
}
print
}
$ awk -f tst.awk file
**OOOO****
********
否则,使用GNU awk的ord((函数:
$ cat tst.awk
@load "ordchr"
{
for (i=ord("a"); i<=ord("z"); i++) {
gsub(sprintf("%c{3,}",i),"**")
}
print
}
$ awk -f tst.awk file
**OOOO****
********
或者你可以使用不同的数字循环范围或split("abc...z",...)
或其他任何东西来获得循环,但重点是-你需要在每个字符上循环。