Sinalizador insensível a maiúsculas e minúsculas DENTRO de um regexp estendido

0

Eu preciso realizar uma correspondência insensível a maiúsculas e minúsculas com a ferramenta grepdiff . Ao contrário do grep, ele não tem um argumento para isso, mas tem --extended-regexp . É possível?

Eu tentei perl, mas não funciona

$ echo SOME | egrep '(?i)some'
$ echo SOME | grepdiff --extended-regexp '(?i)some'
grepdiff: repetition-operator operand invalid
    
por basin 16.02.2018 / 10:04

1 resposta

2

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 ]]
    
por 16.02.2018 / 10:46