我有一个非常长的文件(每天生成超过 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
我只想删除 IP 之间的 <--------> 条目。
假设您的问题可以重述为“我想删除包含的行<----------->
,但前提是后面跟着一个 IP 地址”,那么下面的示例可能适合您。
其中大部分是对这个问题。
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),"