Правило -A INPUT -i lo -j ACCEPT
позволил бы любой трафик, отправленный по lo. Но из-за как Xtables
работы, необходимо удостовериться, что правило появляется перед любыми правилами, которые отрицали бы, что соответствующий пакет для него работает.
sed '/.*EMAIL+\(.*\)SHR.*/{
h;s//\1/;y/_/?/;G
s/\(.*\)\n\(.*EMAIL+\).*SHR/\2\1SHR/}'
Это должно делать работу довольно надежно - она заменит все _
на ?
между последним EMAIL+
, происходящим на одной строке и последним SHR
, происходящим на одной и той же и только на тех же строках, которые содержат обе строки.
С помощью sed
вы можете сделать:
sed -e :1 -e 's/_\([^+]*@\)/?\1/;t1'
То есть заменить _
, за которым следует последовательность символов, отличных от +
. за которым следует @
с ?
с последовательностью символов, и повторять процесс до тех пор, пока он совпадает.
Или сделать это только между EMAIL +
и SHR
:
sed -e :1 -e 's/\(EMAIL+.*\)_\(.*SHR\)/\1?\2/;t1'
Если вы хотите учитывать только строки, начинающиеся с ^ EFT
, вы можете добавьте -e '/ ^ EFT /! b'
, чтобы оставить в покое те, которые не нравятся:
sed -e '/^EFT/!b' -e :1 -e 's/\(EMAIL+.*\)_\(.*SHR\)/\1?\2/;t1'
Обратите внимание, что для таких входных данных, как:
EFT EMAIL+ foo_bar SHR bar_baz EMAIL+ SHR
Оба символа подчеркивания будут заменены, потому что они оба между EMAIL +
и SHR
.
Чтобы этого избежать, можно сделать что-нибудь вроде:
sed '
/^EFT/!b # leave the non-EFT lines alone (branch out)
s/%/%p/g; s/</%l/g; s/>/%r/g; # escape the <>% characters with %
s/EMAIL+/</g; s/SHR/>/g; # replace EMAIL+ and SHR with < and >
:1
s/\(<[^<>]*\)_\([^<>]*>\)/\1?\2/; t1
s/</EMAIL+/g; s/>/SHR/g; # restore EMAIL+ and SHR
s/%r/>/g; s/%l/</g; s/%p/%/g; # restore the escaped <>%'
awk сделает следующее:
$ awk '{ gsub("_", "?", $3) ; print }' < data
EFT_020034-E015133 20140624 /ACC/EMAIL+test?1@mysite.com SHR END
EFT_020034-E015133 20140624 /ACC/EMAIL+test?123?abc@yoursite.net SHR END
EFT_020034-E015133 20140624 /ACC/EMAIL+test?456@theirsite.com SHR END
Адреса электронной почты находятся в поле 3, поэтому мы заменяем _
на ?
только в поле 3, в том числе когда их больше одного _
, используя gsub
.