我需要从文件中删除子域:
.domain.com
.sub.domain.com -- this must be removed
.domain.com.uk
.sub2.domain.com.uk -- this must be removed
所以我使用了 sed :
sed '/.domain.com$/d' file
sed '/.domain.com.uk$/d' file
这部分很简单,但是当我尝试在循环中执行此操作时,会出现以下问题:
while read line
do
sed '/$line$/d' filename > filename
done < filename
我想这是"."和$问题,已经尝试以多种方式逃避它,但我现在没有想法。
受NeronLeVelu想法启发的解决方案:
#!/bin/bash
#set -x
domains=($(rev domains | sort))
for i in `seq 0 ${#domains[@]}` ;do
domain=${domains[$i]}
[ -z "$domain" ] && continue
for j in `seq $i ${#domains[@]}` ;do
[[ ${domains[$j]} =~ $domain.+ ]] && domains[$j]=
done
done
for i in `seq 0 ${#domains[@]}` ;do
[ -n "${domains[$i]}" ] && echo ${domains[$i]} | rev >> result.txt
done
对于cat domains
:
.domain.com
.sub.domain.com
.domain.co.uk
.sub2.domain.co.uk
sub.domain.co.uk
abc.yahoo.com
post.yahoo.com
yahoo.com
你会得到cat result.txt
:
.domain.co.uk
.domain.com
yahoo.com
sed -n 's/.*/²&³/;H
$ {x;s/$/
/
: again
s|(n)²([^³]*)³(.*)1²[^³]*2³|123|
t again
s/[²³]//g;s/.(.*)./1/
p
}' YourFile
在工作缓冲区中加载文件,然后删除(迭代)任何以较早的行结尾的行,最后朊病毒结果。使用临时边分隔符比模式中的更易于管理
GNU sed 的--posix -e
(从 AIX 测试)
您的循环有点混乱,因为您尝试使用 sed
从文件中删除模式,但您从同一个文件中获取模式。
如果您真的想从filename
中删除子域,那么我想您需要更多类似以下内容的内容:
#!/bin/bash
set -x
cp domains domains.tmp
while read domain
do
sed -r -e "/[[:alnum:]]+${domain//./\.}$/d" domains.tmp > domains.tmp2
cp domains.tmp2 domains.tmp
done < dom.txt
cat domains
在哪里:
.domain.com
.sub.domain.com
.domain.co.uk
.sub2.domain.co.uk
sub.domain.co.uk
abc.yahoo.com
post.yahoo.com
cat dom.txt
是:
.domain.com
.domain.co.uk
.yahoo.com
在这些输入上运行脚本会导致:
$ cat domains.tmp
.domain.com
.domain.co.uk
每次迭代都会删除当前从dom.txt
读取domain
子域,将其存储在一个临时文件中,其内容将在下一次迭代中使用以进行额外的过滤。
尝试使用set -x
脚本,您将看到一些替换等。