grep -Eow '\w{10}' | grep -v '\(.\).*\1'
loại trừ các từ có hai ký tự giống hệt nhau.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
loại trừ những cái có ký tự lặp lại.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
đặt các từ trên dòng riêng của chúng bằng cách chuyển đổi bất kỳ phương trình nào scủa các ký tự không phải từ (bao cgồm số alpha và số gạch dưới) thành ký tự dòng mới.
Hoặc với một grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(loại trừ các dòng dưới 10 và hơn 10 ký tự và các dòng có ký tự xuất hiện ít nhất hai lần).
Chỉ với một grep
(GNU grep có hỗ trợ PCRE hoặc pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Đó là, một ranh giới từ ( \b
) theo sau là một chuỗi gồm 10 ký tự từ (với điều kiện là mỗi ký tự không được theo sau bởi một chuỗi các ký tự từ và chính chúng, sử dụng toán tử PCRE nhìn phía trước tiêu cực (?!...)
).
Chúng tôi rất may mắn khi nó hoạt động ở đây, vì không có nhiều công cụ regrec hoạt động với các phản hồi bên trong các bộ phận lặp lại.
Lưu ý rằng (với phiên bản GNU grep của tôi ít nhất)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Không hoạt động, nhưng
grep -Pow '(?:(\w)(?!\w*\2)){10}'
không (như echo aa | grep -Pw '(.)\2'
) mà âm thanh như một lỗi.
Bạn có thể muốn:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
nếu bạn muốn \w
hoặc \b
coi bất kỳ chữ cái nào là một thành phần từ và không chỉ các chữ cái ASCII ở các địa phương không phải ASCII.
Một cách khác:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Đó là một ranh giới từ (một không được theo sau bởi một chuỗi các ký tự từ mà một trong số đó lặp lại) theo sau là 10 ký tự từ.
Những điều có thể có ở phía sau tâm trí của một người:
- So sánh là trường hợp nhạy cảm, do đó,
Babylonish
ví dụ sẽ được khớp, vì tất cả các ký tự đều khác nhau mặc dù có hai B
s, một chữ thường và một chữ hoa (sử dụng -i
để thay đổi điều đó).
- cho
-w
, \w
và \b
, một từ là một chữ cái (cái ASCII chỉ cho GNU grep
cho bây giờ , các [:alpha:]
lớp nhân vật trong miền địa phương của bạn nếu sử dụng -P
và (*UCP)
), chữ số thập phân hoặc dấu gạch dưới .
- điều đó có nghĩa là
c'est
(hai từ theo định nghĩa tiếng Pháp của một từ) hoặc it's
(một từ theo một số định nghĩa tiếng Anh của một từ) hoặc rendez-vous
(một từ theo định nghĩa tiếng Pháp của một từ) không được coi là một từ.
- Ngay cả với
(*UCP)
, các ký tự kết hợp Unicode không được coi là thành phần từ, vì vậy téléphone
( $'t\u00e9le\u0301phone'
) được coi là 10 ký tự, một trong số đó không phải là alpha. défavorisé
( $'d\u00e9favorise\u0301'
) sẽ được kết hợp ngay cả khi nó có hai é
vì đó là 10 ký tự alpha khác nhau được theo sau bởi một dấu cấp tính kết hợp (không phải alpha, do đó, có một ranh giới từ giữa dấu e
và dấu của nó).