remove string termina com certa extensão em um arquivo

0

Precisa remover a entrada .sql no arquivo

Eu tenho arquivo que contém strings termina com .class e .sql e eu preciso remover apenas a string que termina com .sql no arquivo

arquivo.txt

actual.class
actual1.class
actual2.class
actual3.class
actual4.class
test.sql
test2.sql
test3.sql
test4.sql
test5.sql

Arquivo de saída que eu espero que seja

actual.class
actual1.class
actual2.class
actual3.class
actual4.class

Usando o script abaixo, mas não conseguiu

for i in 'cat file.txt' ; do
    fname='echo ${i} | cut -d "." -f1'
    echo ${fname}
    if file=${fname}.sql
    then
    sed "/${fname}.sql/d" file.txt > output_file.txt
    else
    exit 0
    fi
done

com o script acima ficando abaixo da saída

actual.class
actual1.class
actual2.class
actual3.class
actual4.class
test.sql
test2.sql
test3.sql
    
por Bindhu 06.12.2017 / 11:27

4 respostas

2

grep solução:

grep -q '.\.sql$' file.txt && grep -v '\.sql$' file.txt > output_file.txt

O segundo grep declaração / comando será executado somente se o primeiro tiver retornado zero status de saída 0 se qualquer correspondência com o padrão .\.sql$ for encontrada

O conteúdo final output_file.txt :

actual.class
actual1.class
actual2.class
actual3.class
actual4.class
    
por 06.12.2017 / 11:36
1
  • Usando sed

    sed '/\.sql$/d' test.txt
    
  • Para o bash (3.2 +)

    while read -r line; do [[ ! $line =~ .sql ]] && echo "$line"; done <test.txt
    
  • Usando o perl

    perl -ni.bak -e "print unless /.sql/" test.txt
    
por 06.12.2017 / 11:39
0

Acho que já existem boas soluções antes deste post. No entanto, gostaria de salientar vários problemas com o script publicado originalmente.

  • for i in $(cat ...) não é bom, pois também separa sua entrada por espaços por padrão, não apenas por nova linha.
  • A instrução if não faz sentido porque file não está definido. Para uma instrução if típica, você precisaria invocar test , geralmente colocando as coisas dentro de um par de colchetes. Por exemplo, if [ $f = "abc" ]; then . Note que todos os espaços aqui são necessários.
  • exit 0 impede que o script manipule todas as linhas após a linha especificada, acredito que isso não seja intencional.

Espero que isso ajude você a escrever melhores scripts de shell.

    
por 06.12.2017 / 15:17
0

Outra grep, basta inverter o jogo

grep -v "\.sql$" filelist
    
por 06.12.2017 / 17:30