จะลบตัวอักขระที่ซ้ำกันได้อย่างไร


18

ถ้าฉันมีสายเป็น:

Thhiisss iisss mmyyy nameeee

ฉันต้องการพิมพ์สิ่งนี้เป็น:

This is my name

คำสั่ง unix สำหรับสิ่งนี้คืออะไร?


คุณสามารถให้บริบทเพิ่มเติมเกี่ยวกับที่มาของการทำซ้ำและผลลัพธ์ที่ต้องการได้หรือไม่ เกิดอะไรขึ้นถ้า "Mmyyy nameee iisss Jesssssiiieee"?
เปาโลอัลไมด้า

คำตอบ:


24

ด้วยtr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'

คำอธิบาย: -sสวิตช์ของtr"squeezes" อักขระซ้ำ ดังที่แสดงสลับสามารถนำมาใช้กับช่วงของตัวอักษร: ไปaz


2
คำอธิบายบางคำสั่งอาจเป็นประโยชน์สำหรับผู้อ่านในอนาคต
Geek

8

ในระบบ GNU คุณจะต้องใช้sedหรือคล้ายกันหากโลแคลของคุณใช้อักขระหลายไบต์( ตาม jimmij แนะนำ )เนื่องจาก GNU trสามารถอ้างอิงอักขระได้ต่อไบต์เท่านั้น ในโลแคล ASCII คุณสามารถลบรายการซ้ำทั้งหมดที่มีtr :

LC_ALL=C tr -s '\0-\255' <input

ดังนั้น...

echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\0-\255'

... พิมพ์ ...

This is my name

คุณสามารถเลือกโดยการอ้างอิงเป้าหมายของคุณตามช่วง:

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\101-\132'

...หรือ...

echo TTTThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '[:upper:]'

... ที่ทำงานออกมาเป็นสิ่งเดียวกันและที่ทั้งสองพิมพ์:

Thhiisss iisss mmyyy nameeee

... หรือการใช้งาน[:punct:], [:digit:], [:lower:], [:alpha:]หรือสิ่งที่คุณต้องการ คุณสามารถคัดค้านการเลือกด้วย / -c...

echo 'TTTThhiisss     iisss mmyyy nameeee' |
LC_ALL=C tr -cs '[:upper:]'

... พิมพ์ ...

TTTThis is my name

7

ทางเดียวกับsed:

sed ':X;s/\(.\)\1/\1/g;tX'

หรือง่ายกว่า:

sed 's/\(.\)\1*/\1/g'

(ขอบคุณCostasและmikeservสำหรับความคิดเห็น)


sed 's/\(.\)\1\+/\1/g'
Costas

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.