Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用shell脚本删除子字符串_Shell_Substring - Fatal编程技术网

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

如何使用shell脚本删除子字符串,shell,substring,Shell,Substring,我把字符串称为: abc.out def.out 如何删除子字符串 .出去 在这些串里 我应该使用什么命令? (伯恩壳牌) 通常,要删除最短的后缀,请使用: $ echo ${foo%.*} abc.def 要删除最长的后缀,请使用 $ echo ${foo%%.*} abc 如果这些字符串存储在文件中(我们称之为输入文件): 你可以做: sed -i 's/\.out//g' input_file 这将删除该文件中出现的子字符串.out 说明: var1="abc.out" echo

我把字符串称为:

abc.out
def.out
如何删除子字符串

.出去

在这些串里

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

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

$ echo ${foo%.*}
abc.def
要删除最长的后缀,请使用

$ echo ${foo%%.*}
abc

如果这些字符串存储在文件中(我们称之为
输入文件
):

你可以做:

sed -i 's/\.out//g' input_file
这将删除该文件中出现的子字符串
.out

说明:

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
  • sed
    :调用该工具编辑文本流
  • -i
    :使用“就地”选项-这会修改您提供的输入文件,而不是将输出写入
    stdout
  • 's/\.out//g'
    :使用正则表达式删除
    .out
    。末尾的
    g
    表示删除所有事件
  • 输入文件
    :指定输入文件


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

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
您可以使用:

说明:

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
  • 从上面的链接:“${var%Pattern}从$var中删除与$var后端匹配的$Pattern的最短部分。”
  • 请注意,这里提到的“模式”称为globbing,即

多种方式,一种选择:

str=abc.out

外壳:

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
Grep:

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
Sed:

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

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
剪切:

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc
echo$str | cut-d-f1

所有输出:

var1="abc.out"
echo ${str%.*}
echo $str | grep -o '^[^\.]*'
echo $str | awk -F. '{print $1}'
abc

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

$ basename a.out .out
将为您提供:

a

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

DATA="abc.out"
pattern=".out"
DATA=${DATA/$pattern/}
echo "DATA=${DATA}"
结果是:


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

您的sed版本需要一个行结束锚,而
g
标志可能是不可取的。@Williampersell我想这取决于他的文件的精确输入:您是对的,我应该让我的假设更清楚。
basename-s.out a.out
如果您喜欢编写选项,也可以使用。前缀也可以:)谢谢!