[英]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-sed
或perl
:
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.