Como posso remover uma linha específica de um arquivo apenas se houver outras linhas no arquivo?

5

Como posso remover uma linha específica de um arquivo SOMENTE se houver outras linhas no arquivo?

Por exemplo, não toque neste arquivo:

cat file.txt
ASDF

mas remova "ASDF" deste arquivo:

cat file.txt
ASDF
TR422

Porque tem outras linhas além de "ASDF".

Congratulo-me com uma solução em bash, perl ou qualquer outra ferramenta comum.

    
por LanceBaynes 28.08.2011 / 19:22

5 respostas

6

Em bash , usando sed :

if [[ $(< "$file") != "ASDF" ]]; then
  sed -i '/^ASDF$/d' "$file"
fi
    
por 28.08.2011 / 19:38
1

Supondo que seus nomes de arquivo não contenham caracteres de nova linha, isso removerá linhas contendo apenas ASDF de todos os arquivos no diretório atual, a menos que o arquivo seja composto por uma única linha contendo apenas ASDF . Se o seu sed não tiver a opção -i , imprima em um arquivo temporário e mova-o posteriormente.

grep -l ASDF -- * | while IFS= read -r filename; do
  if ! echo 'ASDF' | cmp -s - "$filename"; then
    sed -i -e '/^ASDF$/d' -- "$filename"
  fi
done

Aqui está outra abordagem, que remove as ASDF linhas e substitui o arquivo original apenas se o novo arquivo não estiver vazio nem idêntico ao original.

tmpfile=$(mktemp -p "$(dirname -- "$filename")")
sed '/^ASDF$/' <"$filename" >"$tmpfile"
if [ -s "$tmpfile" ] && ! cmp -s -- "$filename" "$filename"; then
  mv -f -- "$tmpfile" "$filename"
else
  rm -- "$tmpfile"
fi
    
por 28.08.2011 / 20:09
0

Você gostaria de procurar o número de linhas no arquivo.

Pseudocódigo:

if (numberOfLines > 1 && file.contains("ASDF")) {
    file.remove("ASDF");
}
    
por 28.08.2011 / 19:37
0

Uma versão mais curta de resposta da enzotib :

[[ $(< "$file") != "ASDF" ]] && sed -i '/^ASDF$/d' "$file"
    
por 29.08.2011 / 21:03
0

Você pode fazer isso sed -apenas, sem necessidade de testes de shell e outros exemplos:

sed '1{/^ASDF$/{$q;d;};}' infile
    
por 03.02.2017 / 22:12