2012-04-27 98 views
0

我有一個文件有不同的文本行,我想檢查是否是相同模式的重複。查找字符串中的模式linux

在文件:

Blah 
Blah 
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), apta 
blah 

我的目標是讓 「> = 3.0」 & 「< = 6.0」 到文件中。但請記住,有時只有1個「固件」依賴性。

我有什麼到目前爲止,只有抓住了第一次固件信息:

if grep -Fq "firmware (" inputfile #checks if pattern exists 
then 
compat=$(look 'Depends:' inputfile) #grab line where pattern is 
compat=${##*firmware (} #remove pattern and other stuff infront 
compat=${compat%%)*} #remove other stuff behind ")" 
echo $compat >> outputfile 
fi 

我想知道如何檢查,如果有在同一行超過1種模式。或者如果有超過1行的模式相同,如何識別該行可以獲得固件值。由於

編輯:

我最初的目的是檢測是否有相同圖案的不止一個。我對想法持開放態度。 :)

是這樣的:

if (more than one of same pattern) 
get both values #I am open to ideas to get this done <--- 
else 
get value of this pattern 
fi 

EDIT2:

我做它像這樣得到這個工作;

if grep -Fq "firmware (" ./control 
then 
    compat=$(look 'Depends:' control) 
    compat=${compat#*firmware (} 
    compat=${compat%%)*} 
    echo -n $compat > ./compatibility.txt 
    if [ $(grep -o "firmware (" ./control | wc -l) -eq 2 ]; then 

    compat=$(look 'Depends:' control) 
    compat=${compat##*firmware (} 
    compat=${compat%%)*} 
    echo " $compat" >> ./compatibility.txt 
    fi 
fi 

我知道這絕對是非常外行,而且它只能如果模式是在「依賴」的標籤。

任何想法/輸入?

+0

是它始終將是'firmware',或者是你在尋找任何重複'取決於:',或任何標記行中的任何重複? – geekosaur 2012-04-27 03:43:58

+0

另外,可能會有多少重複? – geekosaur 2012-04-27 03:51:30

+0

它有時會成爲'firmware',其他標籤如'Pre-depends:'可能有'firmware'信息。 – AlwynIsPat 2012-04-27 03:52:27

回答

1

如果是正常使用sed

sed -n '/firmware (/ { s/[^(]*(\(\([<>]=\|=\|[<>]\)\s\+[0-9]\+\(\.[0-9]\+\)*\))[^(]*/\1 /g; p }' file 

樣品輸入:

Blah 
Blah 
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), firmware (= 5.0), apta 
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), apta 
Depends: ssloader, firmware (<= 6.0), apta 
blah 

樣本輸出:

>= 3.0 <= 6.0 = 5.0 
>= 3.0 <= 6.0 
<= 6.0 
+0

我真的很喜歡這個,但它可以被增強,所以如果只取得'固件'的價值? '取決於:ssloader,固件(> = 3.0),subr(0.222-1),固件(<6.0),apta'。 它是否工作,如果'固件(> 6.0)'?(請注意,沒有'=') – AlwynIsPat 2012-05-29 05:18:09

+0

@AlwynIsPat查看我的編輯。我使用了幾個gsed擴展使它更短,所以讓我知道如果你沒有gsed,我會使用更長的版本。 – 2012-05-29 16:58:52

1

另一個sed版本,這可能會更好地工作,這取決於你're doing:

sed -n 's/.* firmware (\([^)]*\)),.* firmware (\([^)]*\)),.*$/\1 \2/p' 

(這是比較容易推廣爲多個包,順便)

+0

如果只有一個「固件實例」,那麼這將會失敗,如果你拿出''*'',也許你可以使第二個選項成爲可選項。 – 2012-04-27 04:16:13

+0

我對「多於一個模式」的閱讀沒有包括1.是否應該?(這個問題似乎是專門尋找重複的信息。) – geekosaur 2012-04-27 04:17:39

+0

嗯,也許是這樣。我讀了「最重複的,2.」,意思是在sed說'\ {1,2 \}'也似乎他們的程序已經適應了有一個的情況,但他們希望它可以容納多達兩個。也許OP應該澄清一下。 – 2012-04-27 04:21:50