2013-04-09 27 views
11

noob here,對不起,如果重新發布。我提取一個文件中的字符串,並用線結束了,是這樣的:在bash中將字符串的一部分提取到變量中

abcdefg:12345:67890:abcde:12345:abcde 

比方說,它是在一個名爲的TestString 值的長度之間的冒號不是恆定的變量,但我想將一個字符串的數字保存到第二個和第三個冒號之間的變量中。所以在這種情況下,我最終會得到我的新變量,我們稱它爲extractNum,爲67890。我假設我必須使用sed,但從未使用它並試圖讓我的頭在... 任何人都可以幫忙嗎?乾杯

在一個側面說明中,我使用find從字符串中提取整行,通過搜索第一個字符串(本例中爲abcdefg部分)。

+0

可能重複[如何從bash變量修剪空白?](http://stackoverflow.com/questions/369758/how-to- trim-whitespace-from-bash-variable) – user2284570 2014-07-26 14:17:26

回答

9

這裏的另一種純的bash方式。當您的輸入合理一致並且您不需要靈活選擇哪一部分時,工作良好。

extractedNum="${testString#*:}"  # Remove through first : 
extractedNum="${extractedNum#*:}" # Remove through second : 
extractedNum="${extractedNum%%:*}" # Remove from next : to end of string 

你也可以在閱讀它,在一個while循環,例如過濾文件:

while IFS=' ' read -r col line ; do 
    # col has the column you wanted, line has the whole line 
    # # # 
done < <(sed -e 's/\([^:]*:\)\{2\}\([^:]*\).*/\2 &/' "yourfile") 

sed命令被挑選出的第2列,然後從整條生產線劃定該值與空間。如果您不需要整條生產線,只需從更換中刪除空間+ &,然後從讀取中刪除生產線變量。您可以通過更改\ {2 \}位中的數字來選擇任何列。 (如果你想在那裏使用一個變量,把命令放在雙引號中。)

+0

舊帖子,但因爲年答案被接受,你能完成它與'done <(sed ...)'語法的這麼簡短的解釋嗎? (sed部分很清楚,我想知道左右兩個重定向 - 例如<。Tx。 – Cbhihe 2015-12-06 20:28:12

5

您可以使用cut這種東西。在這裏你去:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR 

對於它的樂趣,這是我會怎樣(不)這樣做有sed,但我敢肯定有更簡單的方法。我想這會是我自己的未來讀者的問題;)

echo abcdefg:12345:67890:abcde:12345:abcde |sed -e "s/[^:]*:[^:]*:\([^:]*\):.*/\1/" 
+0

感謝閃電反應,我會放棄它! – 2013-04-09 08:48:59

+0

另一方面,我會如何使用它來將這個數字放回到一個新的字符串中,替換第二個和第三個冒號之間的內容? – 2013-04-09 08:57:09

+0

我想'awt'更適合它更完善。用sed,你可以做'echo abcdefg:12345:67890:abcde:12345:abcde | sed -e「s/\([^:] *:[^:] *:\)[^:] * \(:。* \)/ \ 1WHATEVER \ 2 /」' – Miquel 2013-04-09 09:14:22

2

這應該爲你工作:關鍵部分是awk -F: '$0=$3'

NewVar=$(getTheLineSomehow...|awk -F: '$0=$3') 

例如:

kent$ newVar=$(echo "abcdefg:12345:67890:abcde:12345:abcde"|awk -F: '$0=$3') 

kent$ echo $newVar 
67890 

如果您的文本存儲在var testString中,您可以:

kent$ echo $testString                                      
abcdefg:12345:67890:abcde:12345:abcde 
kent$ newVar=$(awk -F: '$0=$3' <<<"$testString") 
kent$ echo $newVar                                       
67890 
使用陣列
13

純擊:

testString="abcdefg:12345:67890:abcde:12345:abcde" 
IFS=':' 
array=($testString) 
echo "value = ${array[2]}" 

輸出:

value = 67890 
+0

非常優雅但(不幸的是)只適用於支持linux shell的陣列,比如bash! – Cbhihe 2015-12-06 20:22:18

+2

很確定多數民衆贊成什麼OP要求... bash – 2016-05-26 12:37:25