2010-11-12 100 views

回答

82

一個例子可能是有益的,但如果我理解正確的話,這會工作:

cut -f1 -d":" 

這將轉換成「你好:世界」到「你好」。

+4

'cut'作品的解釋,但丹尼斯的回答更好,更靈活。有沒有人知道它是否會產生像'cut'這樣的新過程? – JoBu1324 2014-02-20 18:06:18

+2

最好使用Bash的內置參數擴展功能,而不是生成運行諸如'basename'和'cut'之類的工具的子殼體,參見Dennis的答案 – 2016-06-14 17:32:54

+0

'cut'可以從標準輸入讀取,所以它更好,尤其是當你有很長的時間需要處理的字符串,如文件的內容。 – Sahas 2017-04-26 08:34:30

3
egrep -o '^[^:]*:' 
+0

你能解釋一下怎麼解釋這個,謝謝。 – 2016-12-28 06:46:07

+1

'egrep'是'-E'的grep。這與普通的'grep'沒有什麼不同。 '-o'指示grep僅打印與表達式匹配的行的部分。 '^'將匹配錨定到一行的開頭。 '[^:] *'匹配零個或多個不是':'字符的字符。 ':'匹配字符':'。 – cdhowie 2016-12-29 16:16:59

+0

再次感謝 – 2016-12-30 02:35:08

166

在Bash(和ksh,zsh,破折號等)中,可以使用參數擴展%這將從字符串末尾或#刪除字符,這將從字符串的開頭刪除字符。如果您使用這些字符中的單個字符,則最小的匹配字符串將被刪除。如果你將角色翻倍,最長的將被刪除。

$ a='hello:world' 
$ b=${a%:*} 
$ echo "$b" 
hello 
$ a='hello:world:of:tomorrow' 
$ echo "${a%:*}" 
hello:world:of 
$ echo "${a%%:*}" 
hello 
$ echo "${a#*:}" 
world:of:tomorrow 
$ echo "${a##*:}" 
tomorrow 
+3

這是本機shell的字符串操作,所以不會產生額外的進程。參考[Bash參數替換](http://tldp.org/LDP/abs/html/parameter-substitution.html#PARAMSUBREF),[Bash String Manipulation](http://tldp.org/LDP/abs/html/ string-manipulation.html)和[Better Bash Scripting](http://robertmuth.blogspot.jp/2012/08/better-bash-scripting-in-15-minutes.html) – 2014-04-14 03:13:04

+0

@denniswilliamson如何刪除2個字符在'hello:world'這樣的特定字符串通過'$ {a%:*}'變成'hello:wo'後? – 3kstc 2016-06-25 13:05:59

+0

很好的答案,非常感謝,但是爲了只獲取'tomorrow',我們還會添加''$ {a ## *:}''= – avtomaton 2016-11-28 01:40:23

4
$ echo 'hello:world:again' |sed 's/:.*//' 
hello 
0

比方說你有一個路徑,在此格式的文件:

/dirA/dirB/dirC/filename.file 

現在你只需要其中包括四個「/」的路徑。鍵入

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/" 

和你的輸出就會

/dirA/dirB/dirC 

使用切口的優點是,你還可以切出uppest目錄以及文件(在這個例子中),因此,如果您鍵入

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/" 

你的輸出將

/dirA/dirB 

雖然你可以從字符串的另一側做同樣的,它不會做出太大的意義在這種情況下,在

dirA/dirB/dirC 

打字

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/" 

結果在另一些情況下,最後案件也可能有所幫助。請注意,在上次輸出開始時沒有「/」。

相關問題