grep '[^[:alnum:]-]'
Returns lines that contain any one character that is neither -
nor classified as alphanumeric in the locale.
Note that it's not limited to letters of alphabetic scripts, it also includes word constituents of non-alphabetic scripts such as Chinese or Japanese characters. It doesn't include combining diacritics though which means line like Stéphane
where the é
is expressed as e
followed by the U+0301 combining acute accent will be reported.
Note that with many grep
implementations, it will fail to report lines that contain sequence of bytes that don't form valid characters in the locale as long as all the valid characters are alnums or -
.
grep -vx '[[:alnum:]-]*'
(Replace *
(0 or more) with +
(1 or more) if you want it to also report empty lines)
Would work better in those cases with some grep
implementations. With GNU grep
, you may need to add the -a
option so it also works even if it detects the input is not valid text.
More generally, portably, you don't get much guarantee with text utilities such as grep
when the input is not valid text. That includes sequences of bytes not forming valid characters, but also lines containing the NUL character or overlong lines.
If you want to restrict to the 52 letters and 10 digits of the POSIX portable character set (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789), you can set the locale to C
/POSIX
:
LC_ALL=C grep '[^[:alnum:]-]'
Which would also help with character decoding issues as all bytes form one valid (though possibly undefined) character in the C locale.