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 / computer / Perguntas / 1862534
Accepted
Zsar
Zsar
Asked: 2024-11-23 03:30:19 +0800 CST2024-11-23 03:30:19 +0800 CST 2024-11-23 03:30:19 +0800 CST

Como transformar tubulação baseada em linha em fluxo contínuo?

  • 772

Na minha busca contínua para colocar arquivos .po sob controle de versão do git, escrevi este script para uso em diff e filter-clean: msgcat --no-location --no-wrap --sort-output - | msgattrib --no-obsolete - | grep -Ev '^"POT-Creation-Date|^"PO-Revision-Date|^"Last-Translator|^"X-Generator'

As entradas .gitconfig para chamar este script se parecem com isto:

[diff "podiff"]
    textconv = cat "$1" | "$(git rev-parse --show-toplevel)"/podiff
    cachetextconv = true
[filter "pocomments"]
    clean = "$(git rev-parse --show-toplevel)"/podiff
    smudge = cat "$1" # NOP; enable the other one temporarily to affect files on checkout, restore, etc., but please do not commit it -Zsar 2024-06-10
#   smudge = "$(git rev-parse --show-toplevel)"/podiff
    required

Cada uma das etapas realiza uma função crucial:

  1. Refactors e alterações de código não relacionadas fazem com que a localização da fonte e a ordem de entrada mudem incessantemente. Esta invocação msgcat normaliza essas, então os arquivos commit-tet não têm essas alterações.
  2. Entradas obsoletas dobram o tamanho dos conjuntos de alterações sempre que um msgid muda. Temos controle de versão -> esta invocação msgattrib os remove.
  3. Esses campos na entrada de metadados de um arquivo .po mudam toda vez que alguém o edita com uma ferramenta dedicada - temos controle de versão -> esta invocação do grep os remove.

Agora surgiu outro obstáculo. Percebeu isso --no-wrapna frente? Não funciona.
Além disso, o encapsulamento não é estável: a cada commit estranho, alguém tem uma palavra invertida entre as linhas sem alterações humanas .
Além disso, a ferramenta relacionada Poedit também tem uma configuração "Wrap at", desabilitar o que também não funciona. (Porque ele delega para as ferramentas gettext, nenhuma surpresa aí. Mas isso significa que não há como eu normalizar os arquivos 'só dessa vez' e terminar com isso. - Por isso eu uso um filtro git em primeiro lugar.)

Muito bem, pensei e testei esta invocação para removê-los: sed -z -e 's/\"\n\"//'.
É para concatenar quaisquer linhas encapsuladas em 'msgid' e 'msgstr', de modo que as ferramentas possam encapsulá-las como quiserem, cada dia de uma forma diferente, pelo que me importa.

  • Ele funciona de forma independente: sed -z -e 's/\"\n\"//' test.poimprime a saída esperada.
  • Funciona quando canalizado para from cat: cat test.po | sed -z -e 's/\"\n\"//'imprime a saída esperada.
  • No entanto, quando adicionado ao script existente, a etapa sed não tem efeito.

Parece que ele recebe a entrada linha por linha. Tentei colocá-lo na frente do grep sem melhora, e não consigo movê-lo na frente dos outros dois, pois o msgcat e o msgattrib têm o problema "Eu gosto dos meus wrappers aleatórios" que deu início a toda essa provação.

Posso transmitir a saída do grep ou, mais genericamente, a saída de um pipe baseado em linha , para que meu editor de fluxo possa fazer seu trabalho?

(Nota: Há muitas respostas neste site que dizem "sed não pode fazer isso" - mas sed é projetado especificamente para não se importar com quebras de linha, então isso parece desinformação. Da página do manual:

Sed é um editor de fluxo. Um editor de fluxo é usado para executar transformações básicas de texto em um fluxo de entrada (um arquivo ou entrada de um pipeline). [...] sed funciona fazendo apenas uma passagem sobre a(s) entrada(s) [.]

ênfase minha

O problema é bem claro que há mais de uma entrada, a mesma string que eu quero substituir, dividida entre elas.)

git
  • 1 1 respostas
  • 34 Views

1 respostas

  • Voted
  1. Best Answer
    grawity
    2024-11-23T04:24:51+08:002024-11-23T04:24:51+08:00

    Pipes são sempre fluxos contínuos – o leitor geralmente não consegue distinguir limites de gravação. (O programa de origem pode decidir armazenar em buffer sua saída e liberá-la linha por linha ou bloco por bloco, mas isso raramente é distinguível.)

    Parece que você tem o problema oposto, ou seja, -zefetivamente diz ao 'sed' para tratar toda a sua entrada como uma única "linha" muito longa e, por padrão, sua s//operação substitui apenas a primeira correspondência nessa "linha".

    Adicione a /gopção para alterar isso:

    msgattrib | grep | sed -z -e 's/\"\n\"//g'
    
    • 1

relate perguntas

  • Windows 10: Não é possível abrir arquivos .ttf dentro de um (antigo) repositório Git

  • GitLab: você não pode enviar commits para arquivos . Você só pode enviar commits que foram confirmados com um de seus próprios e-mails verificados

  • Altere o nome da ramificação padrão do git init

  • adicionar git. comando não funciona

  • Recuperar arquivo excluído do git após o commit

Sidebar

Stats

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

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Vickel O Firefox não permite mais colar no WhatsApp web? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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