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

J0n*_*ann 16 shell substring

我有字符串叫:

abc.out
def.out
Run Code Online (Sandbox Code Playgroud)

如何删除子字符串

.OUT

在这些字符串?

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

Chr*_*our 22

多种方式,选择:

str=abc.out

贝壳:

echo ${str%.*}
Run Code Online (Sandbox Code Playgroud)

grep的:

echo $str | grep -o '^[^\.]*'
Run Code Online (Sandbox Code Playgroud)

桑达:

echo $str | sed -E 's/(.*?)\..*/\1/'
Run Code Online (Sandbox Code Playgroud)

AWK:

echo $str | awk -F. '{print $1}'
Run Code Online (Sandbox Code Playgroud)

切:

echo $str | cut -d. -f1

所有输出:

abc
Run Code Online (Sandbox Code Playgroud)


sam*_*hen 17

如果这些字符串存储在一个文件中(让我们称之为input_file):

# input_file:

abc.out abc.out abc.out
def.out def.out
def.out
Run Code Online (Sandbox Code Playgroud)

你可以做:

sed -i 's/\.out//g' input_file
Run Code Online (Sandbox Code Playgroud)

这将删除.out该文件中出现的任何子字符串.

说明:

  • sed:调用sed工具编辑文本流
  • -i:使用"就地"选项 - 这会修改您提供的输入文件,而不是将输出写入 stdout
  • 's/\.out//g':使用正则表达式删除.out.在g末意味着删除所有出现.
  • input_file:指定输入文件

如果这些字符串存储在变量中:

var1="abc.out"
Run Code Online (Sandbox Code Playgroud)

您可以使用参数替换:

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

abc
Run Code Online (Sandbox Code Playgroud)

说明:

  • 从上面的链接:"$ {var%Pattern}从$ var中删除与$ var的后端匹配的$ Pattern的最短部分."
  • 请注意,这里提到的"模式"称为globbing,它与重要方式的正则表达式不同.


Rob*_*ann 6

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

DATA="abc.out"
pattern=".out"
DATA=${DATA/$pattern/}
echo "DATA=${DATA}"
Run Code Online (Sandbox Code Playgroud)

结果是:

abc

  • 也适用于前缀:) 谢谢! (2认同)

Wil*_*ell 5

$ foo=abc.def.out
$ echo ${foo%.out}
abc.def
Run Code Online (Sandbox Code Playgroud)

一般来说,要删除最短后缀,请使用:

$ echo ${foo%.*}
abc.def
Run Code Online (Sandbox Code Playgroud)

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

$ echo ${foo%%.*}
abc
Run Code Online (Sandbox Code Playgroud)