grep alterando o delimitador

12

de alguma maneira podemos mudar o delimitador que usa grep?

Eu acho que, por padrão, o grep usa \ncomo delimitador.

studiohack
fonte
Parece que seria mais adequado para SuperUser.com
Mitch Dempsey
Leia a página de manual e veja se existe essa opção (não, não acredito que exista).
Cascabel
Eu já li. e não, não há opção
@ Jon: Então não pergunte como mudar o grep, pergunte como fazer o que você quer fazer com outra coisa. Por exemplo, você pode especificar o separador de registros em perl ( $/) e awk ( RS). Ou você poderia fazer algo assim echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Muitas respostas, dependendo do seu problema real.
Cascabel

Respostas:

2

Se você se importa apenas com a saída, trpode funcionar para você:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;
che
fonte
na verdade, tenho um monte de dados como esse, armazenados dentro de uma variável: algo xxxxx aaaaaaaaaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ então, eu estava imaginando se fosse possível: echo $ my_var | grep "algo" isso funciona, mas não como eu quero, o grep pega o conjunto de dados como uma única linha, é por isso que eu quero alterá-lo para um caractere específico (aqui é '@')
Então você pode tentar colocar desta forma:echo $my_var | tr @ '\n' | grep blahblah
che
Eu fiz isso, mas parece que o shell está "tentando" executar o conteúdo: S
2
Você precisa citar a variável $my varpara preservar espaços em branco e novas linhas, ou seja echo "$my_var" | ....
Mrucci
1

agrepda Universidade do Arizona permite definir o delimitador. Não é um substituto para o grep; ele usa um algoritmo diferente (grep aproximado, pode corresponder a erros) e possui uma sintaxe de padrão diferente. Mas é uma ferramenta útil.

Infelizmente, acho que, devido a problemas de licenciamento, houve vários projetos semelhantes chamados agrepe nem todos são compatíveis. Mas acho que todas as versões permitem definir um delimitador.

Norman Ramsey
fonte
1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done
Kurt
fonte
1
(1) Embora isso possa resolver o problema, preferimos que as respostas tenham um pouco mais de explicação. Por exemplo, existe algum motivo real para dizer em d="${1}"vez de apenas d="$1"? (2) Você precisa expandir o seu aviso: Se isso for usado com vários arquivos, você também terá um problema se algum dos nomes de arquivo contiver `@ '. (3) (Nit pick) Um verdadeiro emulador de substituição / grep também funcionaria com zero argumentos de arquivo.
Scott
1

Substitua o delimitador zero ('@') por uma nova linha (\ n) antes de grep:

arquivo de gato | tr '\ 00' '\ n' | grep "string de pesquisa"

Franz Meyer
fonte
0

Como é isso ? Alguma utilidade?

arquivo grep "string de pesquisa" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Defina '@' conforme a sua necessidade.

user42723
fonte