輸入之間的bash的數量:正則表達式中的「報價」
hello world "22" bye world
我需要一個正則表達式,將在bash,可以讓我在引號之間的數字工作。正則表達式應該匹配22
。
謝謝!
輸入之間的bash的數量:正則表達式中的「報價」
hello world "22" bye world
我需要一個正則表達式,將在bash,可以讓我在引號之間的數字工作。正則表達式應該匹配22
。
謝謝!
真的沒有正則表達式在bash本身。然而,有些程序可以使用正則表達式,其中包括grep
和sed
。
grep的主要功能是過濾符合給定正則表達式的行,即將一些數據提供給stdin或文件,並打印與正則表達式匹配的行。
sed確實轉換數據。它不只是返回匹配的行,您可以通過s/regex/replacement/
命令告訴它返回什麼。如果指定-r
選項,輸出部分可以包含對組的引用(\x
,其中x是組的編號)。
所以我們需要的是sed
。你的輸入包含一些東西(^.*
),一個"
,一些數字([0-9]+
),一個"
,和一些東西(.*$
)。我們以後需要引用數字,所以我們需要將數字作爲一個組。所以我們完整的匹配正則表達式是:^.*"([0-9]+)".*$
。我們只想用數字替換,所以替換部分只是\1
。
構建完整的sed命令留作練習你:-)
(請注意,sed的不改造不匹配。如果輸入只有你上面提供的線線,這很好。如果還有其他行你想默默跳過,你需要指定選項-n
(不自動打印),並添加一個n
到sed表達式的結尾,它指示它打印行,這樣它只打印匹配線。)
「bash本身並沒有真正的正則表達式。」 - 見我答案中的第一個例子。 *在Bash中本身就是真正的正則表達式。 「構建完整的sed命令是作爲練習留給你的」 - 或者你可以在我的答案中看到第二個例子,以獲得完整的「sed」命令。 – 2010-05-28 22:07:13
@丹尼斯威廉姆森:是的,我不知道'=〜'在bash中有效。在練習中:這是故意的,我喜歡人們也要自己想想:) – Marian 2010-05-28 23:03:13
嗯你有沒有試過\"([0-9]+)\"
?
nope這不起作用:( – MArio 2010-05-28 18:41:06
你能解釋一下/爲什麼它不適合你嗎? 它適用於我,但你必須捕獲組1(假設你可以做到這一點)。您可以嘗試其他變體,例如'^。* \「([0-9] +)\」。* $'。 – FrustratedWithFormsDesigner 2010-05-28 19:21:04
在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
爲什麼'result ='/'echo $ result'是什麼東西? – Marian 2010-05-28 19:04:41
@Marian:只是演示將結果保存到一個變量進行進一步處理。如果你想讓它進入屏幕,只需自己做'sed ...'。在我的第一個例子中,結果自動放置在一個變量中。我只是做了第一個並行的功能。 – 2010-05-28 22:04:28
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"
這裏的'-e'是什麼? – 2010-05-28 22:08:38
什麼是「正則表達式腳本」?這聽起來有點像家庭作業。 – 2010-05-28 18:15:29
沒有... 我有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