Skip to content

🔬 Comparison

Let us compare rew to a variety of existing tools.

rename

Both rename abd rew can be used to rename multiple files.

rename requires all inputs to be passed as arguments. This means you have to use xargs when processing output of find. rew can read values directly from standard input.

Additionally, rew is only a text-processing tool and cannot rename files by itself. You have to use accompanying mvb / cpb utilities, or you can generate and execute shell code.

find -name '*.jpeg' | xargs rename .jpeg .jpg     # Rename *.jpeg files to *.jpg
find -name '*.jpeg' | rew -d '{B}.jpg' | mvb      # The same thing using rew + mvb
find -name '*.jpeg' | rew -q 'mv {} {B}.jpg' | sh # The same thing using rew + mv + sh

dirname

Both dirname and rew can remove last component from a path:

dirname 'dir/file.txt'   # Will print "dir"
rew '{d}' 'dir/file.txt' # The same thing using rew

basename

Both basename and rew can remove leading directories from a path:

basename 'dir/file.txt'  # Will print "file.txt"
rew '{f}' 'dir/file.txt' # The same thing using rew

basename can additionally remove filename extension, but we have to manually provide it as a suffix. rew is able to remove filename extension automatically:

basename 'dir/file.txt' '.txt' # Will print "file"
rew '{b}' 'dir/file.txt'       # The same thing using rew

In case the suffix does not represent an extension, rew requires an additional filter to remove it:

basename 'dir/file_txt' '_txt'   # Will print "file"
rew '{f|s:_txt$}' 'dir/file_txt' # The same thing using rew

realpath

Both realpath and rew can resolve canonical form of a path:

realpath -e '/usr/../home' # Will print "/home"
rew '{P}' '/usr/../home'   # The same thing using rew

Or they can both compute a relative path:

realpath --relative-to='/home' '/usr' # Will print "../usr"
rew -w '/home' '{A}' '/usr'           # The same thing using rew

pwd

Both pwd and rew can print the current working directory:

pwd                     # pwd is obviously easier to use
rew '{w}' '<any value>' # rew requires an additional input

sed

Both sed and rew can replace text matching a regular expression:

echo '12 ab 34' | sed -E 's/([0-9]+)/_\1_/g' # Will print "_12_ ab _34_"
echo '12 ab 34' | rew '{S:(\d+):_$1_}'       # The same thing using rew

cut

Both cut and rew can print substring:

echo 'abcde' | cut -c '2-4' # Will print "bcd"
echo 'abcde' | rew '{#2-4}' # The same thing using rew

Or they can both print fields:

echo 'ab,cd,ef' | cut -d',' -f2    # Will print "cd"
echo 'ab,cd,ef' | rew -s',' '{&2}' # The same thing using rew

awk

awk is obviously a more powerful tool than rew. However, there are some use cases where rew can replace awk using more compact pattern syntax.

Printing substring:

echo 'abcde' | awk '{print substr($0,2,3)}' # Will print "bcd"
echo 'abcde' | rew '{#2+3}'                 # The same thing using rew

Printing field:

echo 'ab,cd,ef' | awk -F',' '{print $2}' # Will print "cd"
echo 'ab,cd,ef' | rew -s',' '{&2}'       # The same thing using rew

Printing first match of a regular expression:

echo 'ab 12 cd' | awk 'match($0,/[0-9]+/) {print substr($0,RSTART,RLENGTH)}' # Will print "12"
echo 'ab 12 cd' | rew '{=\d+}'                                               # The same thing using rew

grep

Both grep and rew can print matches of a regular expression:

echo 'ab 12 cd' | grep -Po '\d+' # Will print "12"
echo 'ab 12 cd' | rew '{=\d+}'   # The same thing using rew

If an input line contains multiple matches, grep will print each on a separate line. rew will, however, print only the first match from each line. This is because rew transforms lines in 1-to-1 correspondence.

In this particular case, we can workaround it, using raw output mode -R and regex replace filters sS.

echo '12 ab 34' | grep -Po '\d+'                        # Will print "12" and "34"
echo '12 ab 34' | rew -R '{s:^\D+$|S:\D*(\d+)\D*:$1%n}' # The same thing using rew
Back to top