在 bash 中将包含特殊字符的变量传递给 sed



我需要从文件中删除子域:

.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脚本,您将看到一些替换等。

相关内容

  • 没有找到相关文章

最新更新