Not logged in
Public Repositories
mwm's Repositories

How to implement various Unix commands with eddie.


This is just a list of unix commands (or things that feel like they should be Unix commands) along with a partial implementation of them using eddie.

The Unix Bestiary

uniq - remove duplicated lines:
eddie -l -L unlines.hashNub will remove all dupliciates. eddie -L -l "unlines . map headEx . group" only works on presorted files, but works in O(n) time.

head - print the first few lines of a file:
eddie -l -L "unlines . take 10"

tail - print the last 10 lines of a file:
eddie -l -L "unlines . (drop =<< subtract 10 . length)"

wc - count words (or lines, or characters) in a file:
count characters with eddie tshow.length
count words with eddie tshow.length.words
count lines with eddie tshow.length.lines or eddie -l -L tshow.length

wc with names - counts as above, but adding the file name.
count characters with eddie 'tshow . second length=
count words with 'eddie tshow . second (length . words)'
count lines with 'eddie tshow . second (length . lines)'

fgrep - select lines containing a substring:
eddie -l -L 'unlines . filter (isInfixOf "substring")'

grep - select lines matching a regular expression:
eddie -l -L -m Text.Regex.TDFA -m Text.Regex.TDFA.Text 'unlines . (filter (=~ ("r.e." :: Text)))'

sort - sort the lines in a file:
eddie -l -L unlines.sort

The Alternative Bestiary

A collection of commands that do unix-like file processing but don't correspond to a generaly available command (borrowing heavily from http://www.haskell.org/haskellwiki/Simpleunixtools.)

Repeat a file
eddie cycle

Print a file double spaced
eddie -l -L 'unlines . intersperse ""'

Strip blank lines
eddie -l -L 'unlines . filter (not . null)'

Map a file to upper case
eddie toUpper

Strip whitespace from lines in a variety of ways
From the start of each line: eddie -l -m Data.Char 'dropWhile isSpace'
From the end of each line: eddie -l -m Data.Char 'reverse . dropWhile isSpace . reverse'
From both ends of a line: eddie -l -m Data.Char 'let f = reverse . dropWhile isSpace in f . f'

Indent all the lines in a file
eddie -l '(" " ++)'