2012-11-26 107 views

回答

4
$ foo=abc.def.out 
$ echo ${foo%.out} 
abc.def 

一般情況下,刪除最短的後綴,使用:

$ echo ${foo%.*} 
abc.def 

要刪除最長的後綴,使用

$ echo ${foo%%.*} 
abc 
13

如果存儲這些字符串在文件(我們稱之爲input_file):

# input_file: 

abc.out abc.out abc.out 
def.out def.out 
def.out 

你可以這樣做:

sed -i 's/\.out//g' input_file 

,這將刪除該文件中的子.out的任何事件。

說明:

  • sed:調用sed工具來編輯
  • -i文本
  • 流:使用「就地」選項 - 這個修改輸入文件,你提供給它,而不是寫作輸出到 stdout
  • 's/\.out//g':使用正則表達式刪除.out。末尾的g表示刪除所有的事件。
  • input_file:指定輸入文件

如果這些字符串存儲在變量:

var1="abc.out" 

您可以使用parameter subsitution

var1=${var1%.out} 
echo "$var1" 

abc 

說明:

+0

您需要安裝en在你的sed版本上有一行代碼,'g'標誌可能是不可取的。 –

+0

@WilliamPursell我想這取決於他的文件的確切輸入:你是對的,我應該讓我的假設更清楚。 –

11

多種方式,選擇:

str=abc.out

殼牌:

echo ${str%.*} 

grep的:

echo $str | grep -o '^[^\.]*' 

桑達:

echo $str | sed -E 's/(.*?)\..*/\1/' 

awk中:

echo $str | awk -F. '{print $1}' 

切割:

echo $str | cut -d. -f1

所有輸出:

abc 
1

如果這些是文件名,您可以使用基本名稱。

$ basename a.out .out 

會給你:

a 
+0

如果你喜歡寫你的選項,'basename -s .out a.out'也可以工作。 –

1

我發現這個工作最好的,因爲你要使用可以在一個變量的模式:

DATA="abc.out" 
pattern=".out" 
DATA=${DATA/$pattern/} 
echo "DATA=${DATA}" 

結果是:

abc