Como faço uma pesquisa e substituição condicionais que adicionarão uma linha entre duas linhas com diferentes critérios de correspondência?

0

Eu tenho um arquivo de texto com milhares de linhas com caracteres ASCII e não-ACII. É suposto seguir um padrão de

First line: only non-ASCII characters
Second line: only non-ASCII characters
Third line: only ASCII characters
Fourth line: mix of ASCII and non-ASCII characters

Infelizmente, a realidade é que se parece com o exemplo a seguir, onde no meio está faltando a linha que mistura caracteres ASCII e não-ASCII:

日本語のみ
日本語のみ
English words only
English and 日本語
日本語のみ
日本語のみ
English words only
日本語のみ
日本語のみ
English words only
English and 日本語

Felizmente, até onde posso dizer, é apenas a linha que mistura caracteres ASCII e não-ASCII às vezes ausentes. Significa que o que deve ser grupos de 4 linhas são, por vezes, grupos de apenas 3.

Para corrigir o arquivo, preciso:

  1. Pesquise todas as linhas com apenas caracteres ASCII.
  2. Teste a linha a seguir para ver se ela contém apenas não ASCII.
  3. Nesse caso, insira uma linha de espaço reservado seguindo a linha somente ASCII.

O resultado deve ser:

日本語のみ
日本語のみ
English words only
English and 日本語
日本語のみ
日本語のみ
English words only
+Aあ+
日本語のみ
日本語のみ
English words only
English and 日本語

(Eu escolhi para fazer o espaço reservado +Aあ+ para que ele esteja em conformidade com o mix de ASCII e não-ASCII como as linhas que ele está representando.)

Descobri que posso usar sed para inserir novas linhas sed -e "/ isto é texto existente / a \ 'esta é uma nova linha'" < file.text. E aprendi que posso procurar caracteres ASCII com sed usando LC_ALL=C e [\d0-\d127] .

No entanto, não estou claro em como separar condicionalmente a pesquisa. Quer dizer, eu poderia inserir uma linha após cada instância de caracteres ASCII, mas como eu faço uma pesquisa que insere uma linha quando uma linha ASCII é encontrada e a próxima linha é apenas não-ASCII ?

Por favor, note que eu não sou específico sobre o uso de sed. Se uma resposta puder ser fornecida usando Gedit, LibreOffice ou qualquer operação de linha de comando, isso seria ótimo.

    
por Questioner 27.04.2018 / 05:00

2 respostas

2

Com base nas suas perguntas recentes, parece que você tem um problema XY

Aqui está uma solução sed baseada na resposta do @Zanna à sua pergunta anterior Como faço para procurar por linhas em um arquivo que contenha apenas caracteres ASCII? e depois agir sobre eles?

$ LC_ALL=C sed -E '/^[\d0-\d127]+$/ {$!N; s/\n[^\d0-\d127]+$/\n+Aあ+&/;}' file
日本語のみ
日本語のみ
English words only
English and 日本語
日本語のみ
日本語のみ
English words only
+Aあ+
日本語のみ
日本語のみ
English words only
English and 日本語
    
por steeldriver 27.04.2018 / 14:21
2

Usando o awk:

awk '1; ! /^[\x01-\x7F]*$/ {next} {getline} !/[\x01-\x7F]/ {print "+Aあ+"} 1'
  1. Imprima a linha de entrada incondicionalmente - 1 é uma condição verdadeira, e a ação padrão nesse caso é imprimir.
  2. Em seguida, se não for ( ! ) inteiramente ASCII ( /^[\x01-\x7F]*$/ ), ignore o processamento de mais regras (prossiga para a próxima linha, mas processe regras de 1).
  3. Se for totalmente ASCII, obtemos a próxima linha {getline} e, se isso não for ! , tenha qualquer caractere ASCII /[\x01-\x7F]/ , imprima seu espaço reservado.
  4. Por fim, imprima a linha que lemos usando getline .

Estou assumindo que suas linhas não têm espaços ou pontuação de meia largura ( . ! vs 。 ! ).

    
por muru 27.04.2018 / 08:01