An interesting Unix puzzle
This post describes a rather intriguing Unix puzzle. What do you get when you run echo cat | sed statement
? Clearly, the first part yields the string cat
, but I don’t know sed
well enough to get the answer off the cuff. Let’s see what does happen.
$ echo cat | sed statement
cement
Now that was a bit Unexpected. So somehow, the at
part of cat
is being replaced by ement
from statement
.
Now, due to the t’s, I noticed that this look very similar to:
s/at/ement
which looks pretty familiar! So maybe you can use arbitrary delimiters, and the ’t’s are these?
Looking at the section of the sed info page Section 3.5 seems to confirm this:
3.5 The `s' Command
===================
The syntax of the `s` (as in substitute) command is
`s/REGEXP/REPLACEMENT/FLAGS`. The `/` characters may be uniformly
replaced by any other single character within any given `s` command.
This, like a lot of other sed
quirks, is news to me.
So, I suppose I was a bit wrong earlier – all of the t
s are being used as delimiters instead of the usual /
, and it’s just the a
in cat
that’s being replaced with an ement
.
Our puzzle is thus equivalent to:
echo cat | sed 's/a/emen/'
..which, since it is a simple replace of a
with emen
, will give cement
.
Just in order to make sure we have the right explanation, we can try using some random character, say #
, as the delimiter.
$ echo cat | sed 's#a#emen#'
cement
Yep, it works!
❧ Please send me your suggestions, comments, etc. at comments@mandarg.com