【发布时间】:2012-11-14 06:04:36
【问题描述】:
我有字符串调用:
abc.out
def.out
如何删除子字符串
.out
在这些字符串中?
我应该使用什么命令? (伯恩壳牌)
【问题讨论】:
我有字符串调用:
abc.out
def.out
如何删除子字符串
.out
在这些字符串中?
我应该使用什么命令? (伯恩壳牌)
【问题讨论】:
多种方式,一种选择:
str=abc.out
壳牌:
echo ${str%.*}
Grep:
echo $str | grep -o '^[^\.]*'
Sed:
echo $str | sed -E 's/(.*?)\..*/\1/'
Awk:
echo $str | awk -F. '{print $1}'
-F. 表示将字符串拆分为 . $1 表示第一列。
剪切:
echo $str | cut -d. -f1
所有输出:
abc
【讨论】:
zsh中的一个例子:
% myVar="abc.out def.out ghi.out"
% myVar=${myVar:s/.out/} # replace first match of ".out" with ""
% echo myVar
abc def.out ghi.out
% myVar=${myVar:gs/.out/} # replace all matches of ".out" with ""
% echo myVar
abc def ghi
【讨论】:
我发现这效果最好,因为您要使用的模式可以在变量中:
DATA="abc.out"
pattern=".out"
DATA=${DATA/$pattern/}
echo "DATA=${DATA}"
结果是:
abc
【讨论】:
如果这些是文件名,您可以使用 basename。
$ basename a.out .out
会给你:
a
【讨论】:
basename -s .out a.out 也可以使用。
如果这些字符串存储在一个文件中(我们称之为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
说明:
【讨论】:
g 标志可能是不可取的。
$ foo=abc.def.out
$ echo ${foo%.out}
abc.def
一般来说,要删除最短的后缀,请使用:
$ echo ${foo%.*}
abc.def
要删除最长的后缀,请使用
$ echo ${foo%%.*}
abc
【讨论】: