Удалить подстановочные знаки между IP-адресами в файле

У меня очень длинный файл (подробнее генерируется более 4000 строк в день) в следующем формате.

yqiemmtcveihai

test-trans

10.227.30.66

<----------->

14.192.17.143

<----------->

peuddnbtmzdptw

Ttest-trans1

10.227.30.67

<----------->

14.192.17.142

<----------->

cqykfavuxpuqiq

Med

202.21.32.218

<----------->

hziuqbvuncwkie

Myubun

202.21.32.230

<----------->

Я хочу удалить запись <-----------> только между IP-адресами. Итак, результат должен быть в таком формате.

yqiemmtcveihai

test-trans

10.227.30.66

14.192.17.143

<----------->

peuddnbtmzdptw

Ttest-trans1

10.227.30.67

14.192.17.142

<----------->

cqykfavuxpuqiq

Med

202.21.32.218

<----------->

hziuqbvuncwkie

Myubun

202.21.32.230

<----------->

Может ли кто-нибудь предложить мне сценарий, желательно на bash, для достижения этой цели? Голову ломал, но не мог понять.

-1
задан 9 December 2017 в 03:27
1 ответ

Я хочу удалить запись <-----------> только между IP-адресами.

Предполагая, что ваша проблема может быть сформулирована как «Я хочу удалить строки, содержащие <-----------> , но только если за ними следует IP-адрес ', то приведенные ниже примеры могут сработать для вас.

Большинство из них являются адаптациями отличных ответов на этот вопрос SO .

sed

sed -E '$!N;s/<----------->\n(([0-9]{1,3}\.){3}[0-9]{1,3})/\1/;P;D' input.txt

awk

awk 'NR==1 {l=$0; next}
     /^([0-9]{1,3}\.){3}[0-9]{1,3}$/ {
       if(l == "<----------->") { l=$0; next }
     }
     {print l; l=$0}
     END { print l }' input.txt

perl

perl -00 -pe 's/<----------->\n((\d{1,3}\.){3}\d{1,3})/$1/g' input.txt

python

python -c \
  "import re; print re.sub(r'^<----------->\n((\d{1,3}\.){3}\d{1,3})$',
                           r'\1', open('input.txt').read(), flags=re.M),"
1
ответ дан 5 December 2019 в 19:41

Теги

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