Pick Your Poison :) awk, via field separators awk -F- 'BEGIN {OFS="-"} /id: / { NF=NF-1; match($0,"id: (.*)",a);print a[1]}' /usr/share/haskell/*/register.sh That Which Does Not Work * negative length considered zero awk '/id: / {print substr($2,0,-34)}' */register.sh bash a=$(grep "id: " /usr/share/haskell/haskell-utf8-string/register.sh); a=${a%-*}; a=${a#id: }; echo $a a=$(grep "id: " /usr/share/haskell/haskell-utf8-string/register.sh); a=${a%-[[:alnum:]]*}; a=${a#id: }; echo $a head/tail grep "id: " haskell-utf8-string/register.sh | head -c -34 | tail -c +5 That Which Does Not Work * Pipe works on combined output grep -h "id: " */register.sh | head -c -34 | tail -c +5 egrep That Which Does Not Work * groups/lookarounds aren't supported egrep -oE 'id: (.*)-.*' haskell-utf8-string/register.sh awk, via regex awk '{match($0,"id: (.*)-.*",a); printf a[1]}' haskell-utf8-string/register.sh awk '/id: / {match($2,"(.*)-.*",a); print a[1]}' */register.sh That Which Does Not Work * awk does not support lookaheads sed, via regex sed -n 's#id: \(.*\)-.*#\1#p' /usr/share/haskell/*/register.sh That Which Does Not Work * sed does not support lookaheads perl, via regex + lookahead-regex perl -ne 'if ($_ =~ m/id: (.*)-.*/){print $1."\n";}' /usr/share/haskell/*/register.sh * positive lookahead and lookbehind perl -ne 'if ($_ =~ m/(?<=id: )(.*)(?=-.*)/){print $1."\n";}' /usr/share/haskell/*/register.sh Examples :) awk, via field separators for package in $(awk -F- 'BEGIN {OFS="-"} /id: / { NF=NF-1; match($0,"id: (.*)",a);print a[1]}' /usr/share/haskell/*/register.sh); do echo -e "]\t$package";done awk, via regex for package in /usr/share/haskell/*; do a=$(awk '{match($0,"id: (.*)-.*",a); printf a[1]}' "$package/register.sh"); echo -e "]\t$a"; done for package in $(awk '/id: / {match($2,"(.*)-.*",a); print a[1]}' /usr/share/haskell/*/register.sh); do echo -e "]\t$package"; done bash for package in /usr/share/haskell/*; do a=$(grep "id: " "$package/register.sh"); a=${a%-[[:alnum:]]*}; a=${a#id: }; echo -e "]\t$a"; done perl for package in $(perl -ne 'if ($_ =~ m/id: (.*)-.*/){print $1."\n";}' /usr/share/haskell/*/register.sh); do echo -e "]\t$package"; done