Как удалить определенные строки из файла?

Как удалить определенные строки из файла?

У меня есть файл ( ip.txt), содержащий правила 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

Я использую приведенный ниже скрипт bash ( removeip.sh) для удаления строк udp и tcp, которые относятся к определенному IP-адресу из ip.txtфайла.

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

Когда я использую следующую команду в терминале

./removeip.sh 140.237.4.252

он бросает

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

В чем причина этой проблемы и как ее исправить?

решение1

Символ /— это оператор в sed. По сути, вы получаете:

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

Это означает, что вы пытаетесь выполнить «//sb» как команду sed, где b— разделитель, и она не может найти другой «b».

Вам необходимо будет заключить в кавычки специальные символы:

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

И по той же причине вам придется следить за тем, что находится в $ip.

Связанный контент