AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 754657
Accepted
Anil
Anil
Asked: 2023-08-22 17:42:49 +0800 CST2023-08-22 17:42:49 +0800 CST 2023-08-22 17:42:49 +0800 CST

Como combinar tr com xargs e cortar para espremer repetições

  • 772

A resposta principal a esta pergunta demonstra que cutpode ser usado para trcortar com base em espaços repetidos com

< file tr -s ' ' | cut -d ' ' -f 8

Quero obter os controles remotos de vários repositórios Git em um diretório e estou tentando extrair os campos de URL remoto de cada um com o seguinte:

ls | xargs -I{} git -C {} remote -vv | sed -n 'p;n' | tr -s " " | cut -d ' ' -f1

No entanto, isso resulta (por exemplo) na seguinte saída, onde posso ver que dois espaços consecutivos (ponto de código Unicode 32) são retidos:

origin  https://github.com/jik876/hifi-gan.git
origin  https://github.com/NVIDIA/NeMo.git
origin  https://github.com/NVIDIA/tacotron2.git

(Eu também uso xargswith tr)

A saída desejada é uma lista de URLs, como:

https://github.com/jik876/hifi-gan.git
https://github.com/NVIDIA/NeMo.git
https://github.com/NVIDIA/tacotron2.git

O que estou perdendo aqui?

bash
  • 2 2 respostas
  • 40 Views

2 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2023-08-22T17:56:38+08:002023-08-22T17:56:38+08:00

    Isso é uma tabulação, não dois espaços.

    Você pode obter a mesma saída mais segura com um loop de shell iterando sobre os subdiretórios no diretório de trabalho atual que possui um .gitdiretório, depois cuto primeiro campo delimitado por espaço (para remover os rótulos (fetch)e (push)no final que gitadiciona) e depois passar uniqpara mostre apenas uma única linha para cada URL remoto:

    for r in ./*/.git/; do
        git -C "$r" remote -v
    done | cut -f 1 -d ' ' | uniq | cut -f 2
    

    O final cut -f 2isola os URLs retornando o segundo campo delimitado por tabulação.

    Levando em consideração que awktrata tabulações e espaços da mesma forma (a menos que você use um caractere ou padrão separador específico), podemos substituir o pipeline final por uma única invocação de awk:

    for r in ./*/.git/; do
        git -C "$r" remote -v
    done | awk '!seen[$2]++ { print $2 }'
    
    • 4
  2. cas
    2023-08-22T20:07:22+08:002023-08-22T20:07:22+08:00

    Em vez de mexer com todos os espaços em branco, divisão de palavras e problemas de glob que o bash traz, você pode usar uma linguagem mais adequada ao trabalho... e uma que inclua um módulo de biblioteca para interagir com repositórios bashgit tr. Por exemplo, perl com o módulo Git::Raw .cutxargs

    Aqui está um exemplo muito simples de uma linha (embora seja importante notar que Git::Rawé capaz de muito mais do que isso e provavelmente seria melhor escrever um script perl independente que use o módulo):

    Adicionei novas linhas e recuo para facilitar a leitura. Funciona como está ou tudo comprimido em uma linha.

    $ perl -MGit::Raw -l -e '
      foreach my $d (@ARGV) {
        $d =~ s/\.git$//;
        next unless -d "$d/.git";
        my $repo = Git::Raw::Repository->open($d);
    
        print $d;
        foreach my $r ($repo->remotes()) {
         print $r->url
        };
        print "";
      }' */.git
    

    Em inglês, isso é:

    1. Abra cada repositório listado na linha de comando, ignorando diretórios que não são realmente repositórios git,
    2. itere sobre os controles remotos do repositório e imprima seus URLs.

    Exemplo de saída. Executei o one-liner acima em um diretório que às vezes uso para clonar vários repositórios do github. Escrevi a linha única para imprimir o nome do diretório antes da lista de controles remotos pertencentes a esse repositório e uma linha em branco após cada diretório processado.

    mgetty
    https://github.com/Distrotech/mgetty.git
    
    roxterm
    https://github.com/realh/roxterm.git
    
    zpool-iostat-viz
    https://github.com/chadmiller/zpool-iostat-viz.git
    
    

    Nota: Git::Rawnão está incluído no perl, ele precisa ser instalado com cpanou através de um pacote de distribuição (por exemplo, no Debian etc. apt-get install libgit-raw-perlOutras distros provavelmente também o possuem). O módulo é um wrapper Perl em torno do libgit2 , portanto, instalá-lo manualmente com CPAN exigirá gcca instalação da biblioteca de desenvolvimento e dos cabeçalhos do libgit2.

    Também vale a pena notar: mesmo sem Git::Rawanalisar a saída do gitperl (ou quase qualquer outra linguagem), será muito mais fácil e menos sujeito a erros do que fazê-lo no bash. Perl, em particular, foi projetado para correspondência e manipulação de strings; portanto, fazer o que você está tentando fazer no bash é trivial em perl.


    Aliás, se preferir python, você pode querer dar uma olhada no GitPython . No Debian etc, você pode instalá-lo com apt-get install python3-git, e provavelmente também está empacotado para outras distros. Este não usa libgit2, é um wrapper em torno do gitcomando, semelhante ao que você está tentando fazer no bash.

    De alguma forma, perdi isso ontem, mas o libgit2site diz que o pygit2 faz para o python o que Git::Rawfaz para o perl (ou seja, ele usa a biblioteca C libgit2 - portanto, será mais rápido do que bifurcar gitsempre que necessário e evita o risco de problemas de análise de saída). O pacote Debian é python3-pygit2, e provavelmente também está empacotado para outras distros.

    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve