32

我有字符串称为:

abc.out
def.out

如何删除子字符串

。出去

在这些字符串中?

我应该使用什么命令?(伯恩壳牌)

4

6 回答 6

42

多种方式,一种选择:

str=abc.out

壳:

echo ${str%.*}

格雷普:

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

赛德:

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

呸:

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

-F.表示将字符串拆分为 . 并$1表示第一列。

切:

echo $str | cut -d. -f1

所有输出:

abc
于 2012-11-26T17:55:52.970 回答
26

如果这些字符串存储在一个文件中(我们称之为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"

您可以使用参数替换

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

abc

解释:

于 2012-11-26T17:52:04.753 回答
18

我发现这效果最好,因为您要使用的模式可以在变量中:

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

结果是:

abc

于 2017-09-07T20:10:19.080 回答
4
$ foo=abc.def.out
$ echo ${foo%.out}
abc.def

通常,要删除最短的后缀,请使用:

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

要删除最长的后缀,请使用

$ echo ${foo%%.*}
abc
于 2012-11-26T17:52:01.380 回答
1

如果这些是文件名,则可以使用 basename。

$ basename a.out .out

会给你:

a
于 2012-11-26T17:57:13.173 回答
0

中的一个例子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
于 2020-06-17T10:00:30.640 回答