Atribui valores à variável do arquivo de texto. Procure a string no arquivo. Substitua a string no arquivo?

0

Estou trabalhando em um projeto em que preciso corrigir milhares de linhas de dados. Eu já terminei o meio trabalho e agora estou preso na parte final.

Eu tenho um arquivo chamado tree.txt, que tem uma lista de todos os nós, no entanto, devido a algum bug ou algo do tipo, muitos nós têm um nome de tag incorreto. tree.txt-

Main_Overview/Ballast/BA-02:Tag=BA-02
Main_Overview/Ballast/BA-03:Tag=BA-02-1
Main_Overview/Ballast/BA-04:Tag=BA-02-2

Como visto acima, o nome da tag do nó BA-03 e BA-04 está incorreto, portanto, usando o arquivo Handling em C, eu consegui corrigir esse arquivo de texto e também imprimir todas as tags incorretas dos respectivos nós no arquivo abaixo. incorrect_tags.txt -

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

Agora, a última coisa é que há muitos outros arquivos em que o nome incorreto da tag é usado e eu preciso substituir todas as tags incorretas pela correta.

Minha abordagem para resolver o problema é - >

  1. Eu terei duas variáveis node e tag , essas duas variáveis obterão os dados acima incorrect_tag.txt . Vou procurar o valor da tag em cada arquivo e substituí-lo pelo valor do respectivo nó.
  2. Quando terminar de pesquisar e substituir a primeira tag em todos os arquivos, ela fará o mesmo com os demais.

No entanto, devido ao meu conhecimento limitado, não sei se é possível ou não. Além disso, mesmo se eu receber alguma ajuda sobre a sintaxe, eu seria capaz de descansar. Obrigado

Editar -

Os outros arquivos em que preciso pesquisar e substituir dados são diferentes. eg Ballast.j1

:1176:489:15:30:CompID=118680:Text=BA-02:uiFont=Arial-PLAIN-10: 
:1269:489:15:30:CompID=118681:Text=BA-02-1:uiFont=Arial-PLAIN-10:
:1013:489:15:30:CompID=118677:Text=BA-02-2:uiFont=Arial-PLAIN-10:

Existem cerca de 2000 arquivos .j1 onde eu pesquisarei cada nome de tag em todos os arquivos .j1 e o substituirei pelo nome ou nó correto da tag.

    
por gadhvi 18.04.2018 / 08:50

1 resposta

1

Você está simplesmente procurando por isso?

sed -i '\%/\([^/:]*\):Tag=%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%%' *.j1

(Tente sem o -i para ver a saída sem gravar de volta no arquivo original - canalize para less para que você possa pausar e rolar para frente e para trás.)

Os parênteses na primeira expressão procuram uma string entre uma barra e dois pontos; se acharmos isso imediatamente seguido por Tag= e a mesma string que combinou entre parênteses, estamos bem. Os parênteses invertidos capturam essa string para que possamos nos referir a ela como .

Se não encontrarmos esse padrão, a string após Tag= deverá ser diferente da string capturada; se assim for, substitua a string após Tag= com a string capturada. A expressão regular substitui uma sequência que contém um único traço e, de outro modo, nenhum traço, ponto e vírgula ou barra (portanto, até pouco antes do segundo traço ou da primeira barra ou dois-pontos).

Se você estiver em * BSD (incluindo o Mac OS), precisará de -i '' em vez de apenas -i .

Para outra abordagem, você pode refatorar seus mapeamentos para um script sed . Se você tiver um arquivo incorrect_tags.txt like

"BA-02-1" "BA-03"
"BA-02-2" "BA-04"

então você pode executar o seguinte script

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt

que produz ... outro script sed que agora parece

s/BA-02-1/BA-03/g
s/BA-02-2/BA-04/g

que você pode passar para outra instância de sed para modificar os arquivos que contêm esses tokens que você deseja substituir.

O pipeline completo é então

sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt |
sed -i -f - *.j1

e, novamente, você pode querer tentar sem -i primeiro para ver como é a saída. Além disso, seu sed pode não gostar da opção -f ou pode não suportar a leitura de um script na entrada padrão; talvez então simplesmente salve a saída da primeira invocação de sed para um arquivo temporário e então dê o nome do arquivo temporário como o argumento do nome do arquivo para -f .

Observe que isso exigirá que as tags não sejam sobrepostas - se você substituir A por B e B por C, o resultado final será como se você tivesse especificado "A" "C". Uma solução alternativa é trocar a ordem de modo que B seja substituído por C primeiro, e somente então A com B.

    
por 18.04.2018 / 09:15

Tags