2013-05-22 77 views
3

我不是那麼容易的任務,我需要有用的建議。bash從文件中的每個字符串中讀取一個字符

我有一個文件,其中包含主機列表:

host1.example.domain.com 
host2.example.domain.com 
host3.example.domain.com 

,並在bash腳本變量,包含所有可能的主機:

hostblabla.newdomain.org 
... 
host3.example.domain.com 

我需要的是進行簡單的正則表達式是僅與我的第一個列表中存在的主機相匹配。 我想這樣說:

  1. 閱讀所有字符串的第一個字符在我的第一清單
  2. 檢查是否所有charaters是相同的
  3. 如果是這樣,這個字符添加到正則表達式
  4. 否則讓regxep = $regexp"*"
  5. 檢查正則表達式與我的變量,它包含所有主機

但我已經點燃在Bash中,我不知道如何從bash中的每個字符串中只讀取一個字符?

我知道我可以做到以下幾點:

first_character=${a: :1} 

但這是從全局變量$僅第一系統字符。

+0

你爲什麼把它作爲腳本變量,而不是作爲一個外部文件? –

+0

它沒關係,如果它很重要,我可以寫出來,但我猜不。 – xolodec

回答

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)' –

+0

@ShawnChin:是的,我知道。我想讓它容易理解。在現實世界中,我會按照你的建議使用它,以避免臨時文件。 +1 –

+0

不,不幸的是沒有。因爲我擁有全部 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 
+0

我在想那樣,但我怎麼能將包含所需主機列表的文件轉換爲數組's'? 我在文件中;做 ??? – xolodec

相關問題