2010-05-28 77 views
1

輸入之間的bash的數量:正則表達式中的「報價」

hello world "22" bye world 

我需要一個正則表達式,將在bash,可以讓我在引號之間的數字工作。正則表達式應該匹配22

謝謝!

+1

什麼是「正則表達式腳本」?這聽起來有點像家庭作業。 – 2010-05-28 18:15:29

+1

沒有... 我有200個節點,當我向網絡服務詢問節點信息時,它打了200行,其中每行有: nodeid =「x」bla bla bla nodeid =「x」bla bla bla nodeid =「x」bla bla bla nodeid =「x」bla bla bla 我想獲取引號之間的每個id併發送重置命令。 – MArio 2010-05-28 18:40:15

回答

0

真的沒有正則表達式在bash本身。然而,有些程序可以使用正則表達式,其中包括grepsed

grep的主要功能是過濾符合給定正則表達式的行,即將一些數據提供給stdin或文件,並打印與正則表達式匹配的行。

sed確實轉換數據。它不只是返回匹配的行,您可以通過s/regex/replacement/命令告訴它返回什麼。如果指定-r選項,輸出部分可以包含對組的引用(\x,其中x是組的編號)。

所以我們需要的是sed。你的輸入包含一些東西(^.*),一個",一些數字([0-9]+),一個",和一些東西(.*$)。我們以後需要引用數字,所以我們需要將數字作爲一個組。所以我們完整的匹配正則表達式是:^.*"([0-9]+)".*$。我們只想用數字替換,所以替換部分只是\1

構建完整的sed命令留作練習你:-)

(請注意,sed的不改造不匹配。如果輸入只有你上面提供的線線,這很好。如果還有其他行你想默默跳過,你需要指定選項-n(不自動打印),並添加一個n到sed表達式的結尾,它指示它打印行,這樣它只打印匹配線。)

+0

「bash本身並沒有真正的正則表達式。」 - 見我答案中的第一個例子。 *在Bash中本身就是真正的正則表達式。 「構建完整的sed命令是作爲練習留給你的」 - 或者你可以在我的答案中看到第二個例子,以獲得完整的「sed」命令。 – 2010-05-28 22:07:13

+0

@丹尼斯威廉姆森:是的,我不知道'=〜'在bash中有效。在練習中:這是故意的,我喜歡人們也要自己想想:) – Marian 2010-05-28 23:03:13

3

嗯你有沒有試過\"([0-9]+)\"

+0

nope這不起作用:( – MArio 2010-05-28 18:41:06

+0

你能解釋一下/爲什麼它不適合你嗎? 它適用於我,但你必須捕獲組1(假設你可以做到這一點)。您可以嘗試其他變體,例如'^。* \「([0-9] +)\」。* $'。 – FrustratedWithFormsDesigner 2010-05-28 19:21:04

1

在bash> = 3.2:

while read -r line 
do 
    [[ $line =~ .*\"([0-9]+)\".* ]] 
    echo "${BASH_REMATCH[1]}" 
done < inputfile.txt 

使用sed同樣的事情,所以它更便於攜帶:

while read -r line 
do 
    result=$(sed -n 's/.*\"\([0-9]\+\)\".*/\1/p') 
    echo "$result" 
done < inputfile.txt 
+0

爲什麼'result ='/'echo $ result'是什麼東西? – Marian 2010-05-28 19:04:41

+0

@Marian:只是演示將結果保存到一個變量進行進一步處理。如果你想讓它進入屏幕,只需自己做'sed ...'。在我的第一個例子中,結果自動放置在一個變量中。我只是做了第一個並行的功能。 – 2010-05-28 22:04:28

1

Pure Bash,no Regex。數字在數組元素1中。

IFS=\" # input field separator is a double quote now 

while read -a line ; do 
    echo -e "${line[1]}" 
done < "$infile" 
+0

這裏的'-e'是什麼? – 2010-05-28 22:08:38