的空白sed輸出可能對於知道某個人的簡單問題,但我很難從文件中檢索某些變量值。我的文件是這樣的:替換後使用-n
variable1 12
variable2 43
variable3 897
,我希望得到變量2的值,43
我試着用SED,但沒有運氣的一些命令:
sed -n 's/variable2 //;s/variable3//' myFile
的空白sed輸出可能對於知道某個人的簡單問題,但我很難從文件中檢索某些變量值。我的文件是這樣的:替換後使用-n
variable1 12
variable2 43
variable3 897
,我希望得到變量2的值,43
我試着用SED,但沒有運氣的一些命令:
sed -n 's/variable2 //;s/variable3//' myFile
隨着只有sed
:
$ sed -n 's/^variable2 //p' file
43
你的問題是您正在使用-n
打壓sed
輸出,所以你需要p
標誌,以便sed
版畫是其中取代發生的線。
由於這只是模式匹配我會僅 grep的去這樣的:
$ cat file
variable1 12
variable2 43
variable3 897
$ grep -Po '(?<=^variable2)\d+' file
43
甚至只是awk
:
$ awk '$1=="variable2"/{print $2}' file
43
必須在使用sed
?
我更喜歡使用awk
對這種東西:
awk -v varname="variable2" '$1==varname {print $2}' myFile
這隻要沒有變量(在左邊的列)工作包含空格。
編輯:
由於標題是「從文件中獲取變量值在bash」,這裏不涉及外部程序
wantvar="variable2"
datafile="myFile"
while read varname varval; do
# Case-insensitive matching. If you need case-sensitivity, remove the pair of commas
# on both sides.
if [[ ${varname,,} = ${wantvar,,} ]]; then
echo $varval
break
fi
done < $datafile
如果你做內聯賦值,可能是'awk'$ 1 ==「variable2」{print $ 2}'file',並且在這種情況下說bash遠離bash,那麼傳遞'varname'沒有任何好處。 –
@sudo_O true。以防萬一問題製作者想要在某個腳本中嵌入該行。至於你的第二個陳述,這個問題的**標題**是「... with bash」。我寫了腳本來防止問題製作者做一些完全不必要的事情,比如'some_variable =「$(awk ....)」' – pepoluan
不要掛上標題,我已經改變它來反映問題, OP只是錯過了'p'標誌到'sed'。真的bash不適合這種事情! –
雖然我喜歡'grep -Po',但我很少推薦它,因爲它不夠便攜。不過,你的'sed'解決方案** + 1 **。 – ghoti
@ghoti我想說的是,Linux和OSX中的絕大多數都帶有'GNU sed',哪裏不是出於好奇? –
GNU/Linux系統通常帶有GNU sed,但OSX,FreeBSD,Solaris,HP/UX等都有自己的。那麼,OSX的sed是從FreeBSD衍生出來的,Solaris在版本11之前都帶有一個SysV和一個BSD sed。但是你的sed解決方案很好,而且便於攜帶。這是grep的'-P'選項,不是在FreeBSD中,或者是除了OSX之外的其他任何版本,它在10.6版本中開始支持它。它當然不是普遍的。 – ghoti