Sed
如何從一行中提取數字並將其保存到變數中?
我覺得這是一個非常簡單的問題,當我Google時,我找到了很多問題的一部分答案,但是當我嘗試將它們放在一起時,它不起作用,我不知道為什麼。
這是場景:
- 我有一個文件,裡面有很多文本。
- 其中一行與此模式匹配:
foo = 1700;
- 我要提取
1700
- 我想將它保存到 bash 腳本變數中,以便稍後在腳本中引用它。
我無法通過第 3 步。這是我嘗試過的:
sed -nE 's/^foo = //p' file | sed -nE 's/;//p'
這列印出來:
1700
太好了,但是如果我需要修剪空白或其他東西怎麼辦?如果我不能使用
*
/+
,我不知道該怎麼做。我了解到您不能使用*
/+
替代另一個答案,所以我不知道該怎麼做。我查看了 grep 的手冊頁,當我搜尋該單詞時,我沒有看到任何組選項。我想我知道如何在 awk 中解決這個問題,但我總是發現它的正則表達式函式有點笨拙,而且命令行腳本需要太多轉義,所以理想情況下,這不是解決這個問題的唯一方法。
- 首先,以下是擷取數值的方法:
$ echo 'foo = 1700;' | sed -n -e 's/^foo = \([0-9]\+\).*/\1/p' 1700
那是使用
sed
的預設基本正則表達式 (BRE)。您還可以將擴展正則表達式 (ERE) 與 sed 的-E
選項一起使用:echo 'foo = 1700;' | sed -n -E -e 's/^foo = ([0-9]+).*/\1/p' 1700
[0-9]+
括號內的子表達式(
…)
擷取一個或多個數字。這稱為“擷取組”,用於替換\1
(這是第一個擷取組 - 如果有多個擷取組,它們可以用作 \1、\2、\3 等)。在這種情況下,sed 腳本嘗試用 \1 擷取組替換整行,如果成功,則列印修改後的行。 2. 接下來,您要將
sed
’ 的輸出轉換為變數。您可以使用命令替換來做到這一點。例如$ myvar=$(echo 'foo = 1700;' | sed -n -E -e 's/^foo = ([0-9]+).*/\1/p') $ echo $myvar 1700
- 要在您的腳本中使用它,只需使用您的文件作為 sed 的參數,而不是通過管道
echo ...
輸入它。myvar=$(sed -n -E -e 's/^foo = ([0-9]+).*/\1/p' file)
- 修剪空白,或處理可能具有可選前導空白或 . 周圍的可選空白的行
=
等:myvar=$(sed -n -E -e 's/^[[:space:]]*foo[[:space:]]*=[[:space:]]*([0-9]+).*/\1/p' file)
請注意,某些版本的 sed(至少是 GNU sed。也許其他版本)可以理解
perl's
\s
,因此您可以將其縮短為:myvar=$(sed -n -E -e 's/^\s*foo\s*=\s*([0-9]+).*/\1/p' file)