Em bash
, usando sed
:
if [[ $(< "$file") != "ASDF" ]]; then
sed -i '/^ASDF$/d' "$file"
fi
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.
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
Você gostaria de procurar o número de linhas no arquivo.
Pseudocódigo:
if (numberOfLines > 1 && file.contains("ASDF")) {
file.remove("ASDF");
}
Uma versão mais curta de resposta da enzotib :
[[ $(< "$file") != "ASDF" ]] && sed -i '/^ASDF$/d' "$file"
Você pode fazer isso sed
-apenas, sem necessidade de testes de shell e outros exemplos:
sed '1{/^ASDF$/{$q;d;};}' infile
Tags text-processing perl