Sed

如何從一行中提取數字並將其保存到變數中?

  • June 13, 2021

我覺得這是一個非常簡單的問題,當我Google時,我找到了很多問題的一部分答案,但是當我嘗試將它們放在一起時,它不起作用,我不知道為什麼。

這是場景:

  1. 我有一個文件,裡面有很多文本。
  2. 其中一行與此模式匹配:foo = 1700;
  3. 我要提取1700
  4. 我想將它保存到 bash 腳本變數中,以便稍後在腳本中引用它。

我無法通過第 3 步。這是我嘗試過的:

sed -nE 's/^foo = //p' file | sed -nE 's/;//p'

這列印出來:

1700

太好了,但是如果我需要修剪空白或其他東西怎麼辦?如果我不能使用*/ +,我不知道該怎麼做。我了解到您不能使用*/+替代另一個答案,所以我不知道該怎麼做。我查看了 grep 的手冊頁,當我搜尋該單詞時,我沒有看到任何組選項。我想我知道如何在 awk 中解決這個問題,但我總是發現它的正則表達式函式有點笨拙,而且命令行腳本需要太多轉義,所以理想情況下,這不是解決這個問題的唯一方法。

  1. 首先,以下是擷取數值的方法:
$ 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
  1. 要在您的腳本中使用它,只需使用您的文件作為 sed 的參數,而不是通過管道echo ...輸入它。
myvar=$(sed -n -E -e 's/^foo = ([0-9]+).*/\1/p' file)
  1. 修剪空白,或處理可能具有可選前導空白或 . 周圍的可選空白的行=等:
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)

引用自:https://unix.stackexchange.com/questions/653931