Boa pessoal!
Há alguns dias o departamento de contabilidade da empresa
onde trabalho trouxe um problema até nós, eles necessitavam
que determinadas linhas de um arquivo X fossem excluídas e
a relação das linhas a serem apagadas estavam em um arquivo Y.
Logo, alguns pensaram em apagar manualmente e outros em criar
complexos programas para realizar a tarefa. Tentei imaginar
uma solução simples e rápida, que desobrigaria os usuários de
realizar a penosa tarefa de apagar uma a uma as linhas do
arquivo e nos livrar da complexidade de desenvolvimento e
manutenção de um programa mais completo. A primeira coisa que
me veio a cabeça foi criar um "Shell Script".
Bem, este é um programa bem simples, que além de servir a
finalidade citada anteriormente, tem um propósito educacional.
Para o pessoal que quer aprender "Shell Scripting", acredito
que este seja um bom exemplo, pois fiz uso de vários recursos
interessantes, como variáveis, passagem de parâmetros, loops,
estruturas condicionais, "PIPEs" e expressões regulares, etc.
Eis o código:
#!/bin/sh
###################################################
# Line Delete
# (C) Copyleft 2005 Carlos "Null_Terminated" Andre
# null_terminated{no spam}linuxmail.org
# Usage: ./linedel.sh <lines> <data>
###################################################
TMP=${TMP:-/tmp}
BKP=`echo $2 | sed -e 's/\...*$//'`
WFILE=${TMP}/${BKP}$$
SCRPT=${TMP}/script$$
if [ $# -lt 2 ]; then
echo "Usage $0 <lines> <data>"
exit 1
fi
rm -f $SCRPT
for y in `cat $1`; do
echo "${y}d" >> $SCRPT
done
cp $2 ${BKP}.bkp
cat $2 | sed -f $SCRPT >> $WFILE
cp $WFILE $2
rm -f $WFILE
rm -f $SCRPT