从文件中每个字符串读取一个字符的bash命令

3
我有一项不太容易的任务,需要有用的建议。
我有一个包含主机列表的文件:
host1.example.domain.com
host2.example.domain.com
host3.example.domain.com

一个 Bash 脚本中的变量,包含所有可能的主机:
hostblabla.newdomain.org
...
host3.example.domain.com

我需要制作一个简单的正则表达式,仅匹配我的第一个列表中存在的主机。 我这样考虑:
1. 读取我的第一个列表中所有字符串的第一个字符 2. 检查所有字符是否相同 3. 如果相同,则将此字符添加到正则表达式中 4. 否则,使regxep = $ regexp“*” 5. 使用包含所有主机的变量检查正则表达式
但是我在Bash方面经验不足,不知道如何从每个字符串中仅读取一个字符?
我知道我可以做以下事情:
first_character=${a: :1} 

但这只是一个变量 $a 中的第一个字符。

为什么你把它作为脚本中的变量而不是外部文件? - Ignacio Vazquez-Abrams
不需要,我可以将其写入文件,如果有必要的话,但我猜不需要。 - xolodec
2个回答

3

所以你需要两个列表的交集,是吗?

将两个列表排序并去重后放入文件中:

sort -u original_list_of_hosts.txt > sorted_list_of_hosts.txt
echo "$POSSIBLE_HOSTS" | sort -u > possible_hosts.txt

然后使用 join 命令取两个文件的共同部分:

join sorted_list_of_hosts.txt possible_hosts.txt

它将输出存在于两个列表中的主机的排序列表。

1
这可以使用进程替换表示为一行代码 -- join <(sort -u hostfile.txt) <(echo "$POSSIBLE_HOST" | sort -u) - Shawn Chin
@ShawnChin:是的,我知道。我想让它易于理解。在现实世界中,我会像你建议的那样使用它,以避免临时文件。+1 - Michał Šrajer
不,抱歉。因为我在我的第二个列表中已经有了所有的 host1.example.domain.com、host2.example.domain.com 和 host3.example.domain.com。所以两个列表的交集将与第一个列表相同。使用连接的想法确实非常好。但不幸的是,在我的情况下不适用。 - xolodec

0

使用 grep 命令:

#!/bin/bash
s[0]="hostblabla.newdomain.org"
s[1]="host3.example.domain.com"
regex=""
for h in ${s[@]}; do
    regex="$regex -e $h "
done
grep $regex input

我也是这么想的,但是我该如何将包含所需主机列表的文件转换为数组s呢? for i in file; do ??? - xolodec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接