簡體   English   中英

使用 AWK gsub() 用幾個字符替換字符序列

[英]Replace character sequence with several characters using AWK gsub()

我試圖通過用幾個字符(兩個 *)替換幾個相同的字母(超過 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

正則表達式詳情:

  • ([az]) : 匹配[az]並在第 1 組中捕獲
  • \\1 :在第 1 組中捕獲的字母的反向引用
  • {3,} :重復 3 次或更多次

您在標簽中提到sed作為一個選項:

echo "fffffiiiiivvvvveeeee" | sed 's/\([A-Za-z]\)\1\1\1\+/\1/g'
five
echo "fffffiiiiivvveeeee" | sed 's/\([A-Za-z]\)\1\1\1\+/\1/g'
fivvve

以下是如何使用任何 awk 來執行此操作,假設小寫字母為 az = 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",...)或其他任何東西來獲得循環,但重點是 - 你需要在每個字符上循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM