замените символ от строки, которая является промежуточным первым и вторым поиском с помощью sed или awk

Правило -A INPUT -i lo -j ACCEPT позволил бы любой трафик, отправленный по lo. Но из-за как Xtables работы, необходимо удостовериться, что правило появляется перед любыми правилами, которые отрицали бы, что соответствующий пакет для него работает.

2
30.06.2014, 18:13
3 ответа
sed '/.*EMAIL+\(.*\)SHR.*/{
    h;s//\1/;y/_/?/;G
    s/\(.*\)\n\(.*EMAIL+\).*SHR/\2\1SHR/}'

Это должно делать работу довольно надежно - она заменит все _ на ? между последним EMAIL+, происходящим на одной строке и последним SHR, происходящим на одной и той же и только на тех же строках, которые содержат обе строки.

.
1
27.01.2020, 21:51

С помощью 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 <>%'
3
27.01.2020, 21:51

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 .

4
27.01.2020, 21:51

Теги

Похожие вопросы