2013-08-23 45 views
21
削減字符串中特定字符後

所以我有這個字符串:如何在UNIX

[email protected]:/home/some/directory/file 

我只是想解壓目錄地址這意味着我只希望後位「:」字符,並得到:

/home/some/directory/file 

謝謝。

我需要一個通用的命令,所以cut命令不會工作,因爲$ var變量沒有固定的長度。

+1

這可能早就很容易通過谷歌找到,因爲它是一種基本的東西爲您列出的工具。 :-) – Qben

回答

29

使用SED:

$ [email protected]:/home/some/directory/file 
$ echo $var | sed 's/.*://' 
/home/some/directory/file 
+0

如果原始字符串有多個':'字符,該怎麼辦?像'[email protected]一樣。20:管理員:/家庭/一些/目錄/ file'。我們怎麼能只獲得最後一個字段(路徑數據)? –

+1

@SopalajodeArrierez,給定的命令將工作。請參閱http://asciinema.org/a/16807(因爲'。*'會盡可能匹配:貪婪) – falsetru

7

這應該做的伎倆:

$ echo "$var" | awk -F':' '{print $NF}' 
/home/some/directory/file 
2
awk -F: '{print $2}' <<< $var 
8

爲了完整起見,使用切

cut -d : -f 2 <<< $var 

而且只使用bash下

IFS=: read a b <<< $var ; echo $b 
21

這可能會爲你工作:

echo ${var#*:} 
+0

+1當shell爲此提供了內置語法時,請勿混淆神祕的外部實用程序。如果你不需要移植到舊的shell,也許可以探索'「$ {var ## *:}」。但是除非特別尋找空格標記,否則不要忽略變量插值周圍的雙引號。 – tripleee

+0

@tripleee在這裏稍微有些東西...... s /舊殼/非POSIX殼/。包含'$ {var#...}'和'$ {var ## ...}'的參數擴展由POSIX定義。 –

+3

如果你不解釋它是如何工作的,那麼這個答案很沒用。可以在這裏找到解釋:http://stackoverflow.com/a/19482947/1220835 – Basti

7

這也將這樣做。

echo $var | cut -f2 -d":" 
2

你不說你正在使用哪個shell。如果它是一個POSIX兼容的,如猛砸,然後參數擴展可以做你想做什麼:

參數擴展

...

${parameter#word}

刪除最小匹配模式。
word已擴展以生成模式。然後參數展開產生parameter,其中前綴的最小部分與被刪除的模式相匹配。

換句話說,你可以寫

$var="${var#*:}" 

這將刪除任何匹配從$var*:(即一切直到幷包括第一:)。如果您想匹配最後的:,那麼您可以使用##代替#

這一切都是假設的部分刪除不包含:(真正的IPv4地址,但不能使用IPv6地址)