How to delete non-ASCII chars in file

Mark B. mkbucc at
Fri Sep 5 16:27:14 UTC 2008

On Fri, Sep 5, 2008 at 10:58 AM, Giorgos Keramidas
<keramida at> wrote:

> $ echo '^Fhello^F' | sed -e 's/[^[:print:]]*//' | hd
> 00000000  68 65 6c 6c 6f 06 0a                              |hello..|
> 00000007
> $


> The matching pattern is wrong.  You need `[^[:print:]]'.  The character
> class of printable characters is `[:print:]', and you can negate the
> pattern with `[^xxxx]' where `xxxx' is the character class; hence the
> extra pair of brackets in `[^[:print:]]'.

In case you are interested, I've patched the re_format man page with this
example.  I had read it, and it says :print: is the "name of the character
class."  I think the concrete example helps clarify things.

A follow question--is it possible to use that statement in a Makefile (BSD)?
A straight cut 'n paste didn't work, and I couldn't figure out the escaping to
make it work.



cd to /usr/src/lib/libc/regex/ and apply this patch.

--- /dev/null Fri Sep  5 12:12:21 2008
+++ re_format.7        Fri Sep  5 12:18:29 2008
@@ -288,6 +288,10 @@
 A locale may provide others.
 A character class may not be used as an endpoint of a range.
+To match all characters not in a class, use a bracket expression
+like this:
+.Ql [^[:print:]] .
 There are two special cases\(dd of bracket expressions:
 the bracket expressions
 .Ql [[:<:]]

More information about the freebsd-questions mailing list