如何使用shell脚本删除子字符串

时间:2012-11-26 17:49:38

标签: shell substring

我有一些叫做的字符串:

abc.out
def.out

如何删除子字符串

  

.OUT

在这些字符串中?

我应该使用什么命令? (Bourne Shell)

6 个答案:

答案 0 :(得分:17)

多种方式,选择:

str=abc.out

<强>贝壳:

echo ${str%.*}

<强> grep的:

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

Sed:

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

<强> awk中:

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

<强>剪切:

echo $str | cut -d. -f1

所有输出:

abc

答案 1 :(得分:15)

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

<强>解释

答案 2 :(得分:4)

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

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

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

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

$ echo ${foo%%.*}
abc

答案 3 :(得分:3)

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

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

结果是:

abc

答案 4 :(得分:1)

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

$ basename a.out .out

会给你:

a

答案 5 :(得分: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