Lê a linha do arquivo e apaga

5

Como posso ler uma série de linhas de um arquivo e depois remover cada linha?

Obviamente eu posso ler assim:

while read -r line; do
echo $line
done < myfile.txt

Mas se eu fizer isso:

while read -r line; do
echo $line
sed '1d' myfile.txt
done < myfile.txt

Eu só recebo a primeira linha

Estou procurando uma maneira elegante de ler uma linha, fazer algo com ela e depois removê-la antes de passar para a próxima linha do arquivo.

    
por DanF 23.01.2015 / 11:55

3 respostas

2

Eu prefiro invocar sed apenas uma vez e depois em cada iteração de linha. Se você gosta de alterar o arquivo original, pode adicionar a opção -i ( - no local ) a sed .

unset n
while read -r line; do
  echo $line
  : $[n++]
done < myfile.txt
sed "1,$n d" myfile.txt
    
por 23.01.2015 / 12:01
0

Você pode fazer:

sed -n '$d;w file2' >file1 <<IN
$(cat file1; echo .)
IN

Que gravará com segurança todas as linhas do arquivo1 no arquivo2, excluindo simultaneamente todas as linhas no arquivo1. O shell lida com o arquivo temporário intermediário de forma segura - ele cria um e depois o exclui do sistema de arquivos antes de gravar um único byte nele.

Assim que sed libera o descritor de arquivo (no EOF ou quando ele termina - o que ocorrer primeiro) , o arquivo deixa de existir. Ao contrário da opção comum sed -i , isso não depende de sed limpar depois de si mesmo (o que pode não acontecer se o processamento for inesperadamente interrompido) e não traz consigo as mesmas inconsistências de permissões a opção -i implica.

E o aplicativo não precisa ser global como demonstrado - as linhas podem ser excluídas do original e / ou gravadas seletivamente na saída separada ...

sed -n '$d;/pattern1/w file2
           /pattern2/p' >file1 <<IN
$(cat file1; echo .)
IN

... demonstra como apenas as linhas do arquivo1 que correspondem a /pattern2/ serão impressas de volta no arquivo1 e apenas linhas do mesmo que correspondem a /pattern1/ são w ritten para arquivo2. Qualquer outro comando sed é obviamente aplicável também.

Vale a pena notar, porém, que para a maioria dos shells isso não carregará bytes NUL do arquivo1 (o que não é uma preocupação para sed work) - embora tal coisa é possível com zsh .

    
por 24.01.2015 / 01:47
0

Você pode substituir todas as linhas de um arquivo depois que ele for processado corretamente com esse snippet (não remova se o processamento falhar, para que você possa reprocessá-las se necessário):

while read; do
  if some_command_worked_correctly; then
    sed -i '1,1 d' file-to-read
  fi
done < file-to-read
    
por 16.05.2016 / 10:50

Tags