使用AWK gsub()将字符序列替换为多个字符

  • 本文关键字:字符 替换 使用 gsub AWK awk
  • 更新时间 :
  • 英文 :


我试图通过用几个字符(两个*(替换几个相同的字母(超过3个(来转换文本。

我的输入:

ffffOOOOuuuurrrr
fffffiiiiivvvvveeeee

我应该得到什么:

**OOOO****
********

我的测试命令是:

awk '{gsub(/[a-z]{4}/,"*"); print}' textfile

我不明白如何将{4}转换为"大于3"。

还有如何将*打印两次(如相乘(。

我也确信条件"三个以上"会将输入转换为:

**OOOO**
**

有没有办法避免这种情况(替换一系列相同的字母(?

或者它不可能适应一个小命令。

POSIX awk或sed不支持反向引用。您需要使用gnu-sedperl:

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",...)或其他任何东西来获得循环,但重点是-你需要在每个字符上循环。

最新更新