Como remover linhas específicas de um arquivo?

Como remover linhas específicas de um arquivo?

Eu tenho um arquivo ( ip.txt) que contém regras 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

Estou usando o script bash ( removeip.sh) abaixo para remover linhas udp e tcp que pertencem a um IP específico do ip.txtarquivo.

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

Quando eu uso o comando abaixo no terminal

./removeip.sh 140.237.4.252

isso joga

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

Qual é a causa desse problema e como posso corrigi-lo?

Responder1

O /personagem é um operador em sed. Basicamente você está terminando com:

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

Isso significa que você está tentando executar '//sb' como um comando sed, onde bestá o separador, e não consegue encontrar outro 'b'.

Você precisaria citar os caracteres especiais:

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

E você precisaria estar atento ao que está em $ip pelo mesmo motivo.

informação relacionada