grep -Eow '\w{10}' | grep -v '\(.\).*\1'
ไม่รวมคำที่มีอักขระเหมือนกันสองตัว
grep -Eow '\w{10}' | grep -v '\(.\)\1'
ไม่รวมอักขระที่มีอักขระซ้ำกัน
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
ใส่คำในบรรทัดของตนเองโดยแปลงความsเท่าเทียมกันของคำที่ไม่ใช่ตัวอักษร (ไม่ใช้ตัวอักษรcและตัวเลขและขีดเส้นใต้) เป็นอักขระขึ้นบรรทัดใหม่
หรือหนึ่งgrep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(ยกเว้นบรรทัดที่น้อยกว่า 10 และมากกว่า 10 ตัวอักษรและบรรทัดที่มีตัวอักษรปรากฏอย่างน้อยสองครั้ง)
ด้วยหนึ่งgrep
เดียว (grep GNU พร้อมการสนับสนุน PCRE หรือpcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
นั่นคือขอบเขตของคำ ( \b
) ตามด้วยลำดับของ 10 ตัวอักษรคำ (โดยมีเงื่อนไขว่าแต่ละคนจะไม่ได้ตามลำดับตัวอักษรของคำและตัวเองโดยใช้ผู้ประกอบการเชิงลบมองไปข้างหน้า PCRE (?!...)
)
เราโชคดีที่ทำงานได้ที่นี่เนื่องจากมีเครื่องมือ regexp ไม่มากที่ทำงานกับ backreferences ภายในส่วนที่ทำซ้ำ
โปรดทราบว่า (ด้วยรุ่น GNU grep ของฉันอย่างน้อย)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
ใช้งานไม่ได้ แต่
grep -Pow '(?:(\w)(?!\w*\2)){10}'
does (as echo aa | grep -Pw '(.)\2'
) ซึ่งฟังดูเหมือนบั๊ก
คุณอาจต้องการ:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
ถ้าคุณต้องการ\w
หรือ\b
พิจารณาตัวอักษรใด ๆ เป็นองค์ประกอบคำและไม่ใช่แค่ตัวอักษร ASCII ในที่ไม่ใช่ ASCII
ทางเลือกอื่น:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
นั่นคือขอบเขตคำ (หนึ่งที่ไม่ได้ตามด้วยลำดับของตัวอักษรคำที่หนึ่งซ้ำ) ตามด้วย 10 ตัวอักษรคำ
สิ่งที่อาจมีที่ด้านหลังของจิตใจ:
- การเปรียบเทียบเป็นแบบตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
Babylonish
ตัวอย่างเช่นจะจับคู่กันเนื่องจากตัวละครทั้งหมดจะแตกต่างกันแม้ว่าจะมีสองตัวB
หนึ่งตัวล่างและตัวพิมพ์ใหญ่หนึ่งตัว (ใช้-i
เพื่อเปลี่ยนสิ่งนั้น)
- สำหรับ
-w
, \w
และ\b
คำเป็นตัวอักษร (คน ASCII เฉพาะสำหรับ GNU grep
สำหรับตอนนี้ที่[:alpha:]
ชั้นตัวในสถานที่ของคุณถ้าใช้-P
และ(*UCP)
) ตัวเลขทศนิยมหรือขีด
- นั่นหมายความว่า
c'est
(คำสองคำตามนิยามของคำในภาษาฝรั่งเศส) หรือit's
(คำหนึ่งคำตามคำจำกัดความภาษาอังกฤษบางคำ) หรือ(คำหนึ่งคำตามคำนิยามของคำศัพท์rendez-vous
ภาษาฝรั่งเศส) ไม่ถือว่าเป็นหนึ่งคำ
- ถึงแม้จะมี
(*UCP)
ตัวละครที่รวม Unicode ไม่ถือเป็นองค์ประกอบของคำดังนั้นtéléphone
( $'t\u00e9le\u0301phone'
) ถือเป็น 10 ตัวอักษรซึ่งหนึ่งในนั้นไม่ใช่อัลฟา défavorisé
( $'d\u00e9favorise\u0301'
) จะจับคู่แม้ว่ามันจะมีสองตัวé
เพราะนั่นคือ 10 ตัวอักษรอัลฟาที่แตกต่างกันทั้งหมดตามด้วยการรวมกันของสำเนียงเฉียบพลัน (ไม่ใช่อัลฟาดังนั้นจึงมีขอบเขตของคำระหว่างe
และสำเนียง)