Если вы хотите заменить все DROP
S для Iptables цепи с ACCEPT
с, использовать якорь для начала строки:
String=':INPUT'
sed -i -e 's/^\(*'"$String"' *\)DROP/\1ACCEPT/' "$File"
Команда захватывает $String
рисунок в начале строки (^
) с рядом дополнительных пространств (*
) и ссылается на захваченное содержимое с помощью \1
.
Если, однако, вы хотите, чтобы соответствовать всей линии, использовать якорь для конца строки ($
), а также:
sed -i -e 's/^\(*'"$String"' *\)DROP\(*\[0:0\] *\)$/\1ACCEPT\2/' "$File"
Вы, вероятно, хотите, чтобы выражение немного более гибким, позволяя любому количество цифр для [<packet-counter>:<byte-counter>]
пары, так как счетчики не имеет значения для логики правил Iptables:
sed -i -e 's/^\(*'"$String"' *\)DROP\(*\[[0-9]\+:[0-9]\+\]\)$/\1ACCEPT\2/' \
"$File"
команда выше заменяет запись сохраненного IPTables файла следующим образом:
< :INPUT DROP [0:0]
< :INPUT DROP [618709275:676424577017]
---
> :INPUT ACCEPT [0:0]
> :INPUT ACCEPT [618709275:676424577017]
Также обратите внимание на использование двойных кавычек. Закрытие переменной в двойных кавычках предотвращает переинтерпретацию специальных символов, кроме $
, backtick и \
. В противном случае вы рискуете применить команду к нескольким файлам (если, например, $File
содержит *
).
Просто, как большая часть исходной строки считается фиксированной и подходит для сравнения? В крайнем случае вы можете просто сопоставить всю строку и заменить ее: 'sed -i -e 's/^: INPUT DROP [0: 0] $ /: INPUT ACCEPT [0: 0] /'' – chepner