¿Cómo eliminar líneas específicas de un archivo?

¿Cómo eliminar líneas específicas de un archivo?

Tengo un archivo ( ip.txt) que contiene reglas de ip.

/sbin/iptables -A INPUT -p tcp -s 140.237.4.252 -j DROP
/sbin/iptables -A INPUT -p tcp -s 143.227.5.22 -j DROP

/sbin/iptables -A INPUT -p udp -s 140.237.4.252 -j DROP
/sbin/iptables -A INPUT -p tcp -s 143.227.5.22 -j DROP

Estoy usando el siguiente script bash ( removeip.sh) para eliminar las líneas udp y tcp que pertenecen a una IP específica del ip.txtarchivo.

function removeip(){
    ip="$1"        
    udprule="/sbin/iptables -A INPUT -p udp -s "$ip" -j DROP"
    tcprule="/sbin/iptables -A INPUT -p tcp -s "$ip" -j DROP"
    sed --in-place /"$udprule"/d /root/ip.txt
    sed --in-place /"$udprule"/d /root/ip.txt     
}

removeip $1

Cuando uso el siguiente comando en la terminal

./removeip.sh 140.237.4.252

arroja

sed: -e expression #1, char 59: unterminated `s' command

¿Cuál es la causa de este problema y cómo puedo solucionarlo?

Respuesta1

El /personaje es un operador en sed. Básicamente estás terminando con:

sed '//sbin/iptables -A INPUT -p tcp -s "{ip}" -j DROP/d' /root/ip.txt

Esto significa que está intentando ejecutar '//sb' como un comando sed, donde bestá el separador, y no puede encontrar otra 'b'.

Deberías citar los caracteres especiales:

udprule="\/sbin\/iptables -A INPUT -p udp -s "$ip" -j DROP"

Y deberías tener cuidado con lo que hay en $ip por la misma razón.

información relacionada