Você precisa dizer à família grep
para usar REs semelhantes a Perl.
echo SOME | grep -P '(?i)some'
SOME
Infelizmente, este sinalizador não está disponível em grepdiff
e, até onde eu posso ver, nem é -i
(correspondência insensível a maiúsculas e minúsculas).
Aqui está um pequeno script, que eu chamei de pgrepdiff
, que permitirá que você use um PCRE para corresponder à sua saída diff
. Não aceita nenhum dos sinalizadores que grepdiff
permite. Ele lê arquivos nomeados ou stdin se nenhum for fornecido. Omitir o ER transforma-o num dispendioso operador cat
:
#!/bin/bash
#
# Usage: pgrepdiff <re> [<files...>]
#
# https://unix.stackexchange.com/a/424566/100397
#
tmpd=$(mktemp --tmpdir --directory 'pgd.XXXXXXXXXX')
re="$1"
shift
# Split the file into its context diff parts
cat "$@" | csplit - -f "$tmpd/xx." -k -n4 -s -z '/^@@/' '{*}'
# Save the header preamble for a match
mv -f "$tmpd/xx.0000" "$tmpd/head"
head=
# Iterate across all the diff segments
shopt -s nullglob
for xx in "$tmpd"/xx.????
do
if grep -q -P "$re" "$xx"
then
[[ -z $head ]] && cat "$tmpd/head" && head=yes
cat "$xx"
fi
done
# Tidy up
rm -rf "$tmpd"
# Return 0 (success) iff we matched something
[[ -n $head ]]