Como deletar linha se o padrão estiver em posição específica

1

Estou com problemas para excluir a linha de um arquivo. Meu programa irá verificar por uma condição particular usando while e se loop e se corresponder, exclua a linha do arquivo. Mas ao excluir estou recebendo o erro como "sed: não pode ler". Acho que estou perto da solução, mas não consigo resolver o problema. Abaixo está o código que estou usando.

#!/bin/ksh

File='dsgp_p50.dat'
cd /home/lpadmin
while read -r line
do
x='echo "$line" | cut -c 75-104'
echo $x
if [ $x == '00000000000000+00000000000000+' ]
then
sed '1,1d' "$line" > vikas.dat
fi
done < $File

ATUALIZADO:

Eu tenho um arquivo que contém dados no formulário abaixo.

507425B30    171013D248900022   4057-ACCR PROPERTY TAX  
00000000257910+00000000000000+00000000257910+00000000000000+00000000000000+
507425B30    171013C249999092   1071-DO NOT USE         
00000000000000+00000000000000+00000000000000+00000000031940+00000000000000+

Agora eu tenho que apagar as linhas que contém o padrão como 00000000000000 + 00000000000000 + (A posição deste padrão no arquivo é 75-104) e a parte complicada é que temos que excluir a linha somente quando ela entra a primeira ocorrência na mesma linha. Haverá cenários como o primeiro registro acima, onde o padrão veio no último e não deve excluir a linha do arquivo. Ele deve excluir a linha somente quando o padrão 00000000000000 + 00000000000000 + estiver na posição 75-104.

    
por Ravi Rock 25.10.2017 / 13:49

1 resposta

2

Algum sed sugere para você:

  1. Quase nunca faz sentido fazer um loop while read sobre um arquivo e usar sed ou awk dentro, pois essas ferramentas são projetadas para processar um arquivo linha por linha, de qualquer forma

  2. O intervalo de endereços em sed '1,1d' é supérfluo. Se você quiser endereçar uma única linha, você pode fazer sed '1d' sem intervalo. Neste caso, existe apenas uma linha de qualquer forma, então por que redirecionar uma linha excluída para um arquivo?

  3. Em sed '1,1d' "$line" , espera-se que $line seja o nome do arquivo!

  4. Então, o que você deve fazer é um simples sed '/find the right regexp/d' $File .

  5. O padrão para corresponder à string dada na posição 75ff na linha seria /^.\{74\}00000000000000+00000000000000+/ (esse é o começo da linha ( ^ ), seguido por 74 caracteres aleatórios e o padrão.

  6. Como no ponto acima, o \{number\} fornece um número de itens repetidos, você pode simplificar para /^.\{74\}0\{14\}+0\{14\}+/

  7. Agora você pode simplificar ainda mais agrupando a sequência repetida: \(sequence\)\{2\)

Agora, usando expressões regulares estendidas para evitar que a barra invertida escape, todo o seu script pode ser substituído por um simples

sed -E '/^.{74}(0{14}\+){2}/d' $File
    
por 25.10.2017 / 14:45