Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
Bash 需要使用sed剥离字符的帮助吗_Bash_Sed - Fatal编程技术网

Bash 需要使用sed剥离字符的帮助吗

Bash 需要使用sed剥离字符的帮助吗,bash,sed,Bash,Sed,我有一个字符串:abc-2.25_20141104-1586.uvw.xyz 我想脱掉.uvw.xyz并保留abc-2.25_20141104-1586。如何使用sed实现这一点?谢谢你的帮助 这里有一种可能性: sed 's/\.[[:alpha:]]\{3\}\>//g' 说明:从开始,然后是三个字母字符,然后是单词的结尾。这里有一种可能性: sed 's/\.[[:alpha:]]\{3\}\>//g' $ echo "abc-2.25_20141104-1586.uvw.

我有一个字符串:abc-2.25_20141104-1586.uvw.xyz

我想脱掉.uvw.xyz并保留abc-2.25_20141104-1586。如何使用sed实现这一点?谢谢你的帮助

这里有一种可能性:

sed 's/\.[[:alpha:]]\{3\}\>//g'
说明:从开始,然后是三个字母字符,然后是单词的结尾。

这里有一种可能性:

sed 's/\.[[:alpha:]]\{3\}\>//g'
$ echo "abc-2.25_20141104-1586.uvw.xyz" | sed 's/\(.*-[0-9]*\)\..*/\1/'
abc-2.25_20141104-1586
说明:从开始,然后是三个字母字符,然后是单词的结尾

$ echo "abc-2.25_20141104-1586.uvw.xyz" | sed 's/\(.*-[0-9]*\)\..*/\1/'
abc-2.25_20141104-1586
说明:.-[0-9]=>匹配开头的所有内容,但不匹配的后缀除外。 和 1=>是匹配的第一个模式

请参阅: 关于保持模式的部分

echo "abc-2.25_20141104-1586.uvw.xyz" | sed 's/\.[a-z]\{3\}\.[a-z]\{3\}//g'
说明:.-[0-9]=>匹配开头的所有内容,但不匹配的后缀除外。 和 1=>是匹配的第一个模式

请参阅: 关于保持模式的部分

echo "abc-2.25_20141104-1586.uvw.xyz" | sed 's/\.[a-z]\{3\}\.[a-z]\{3\}//g'
输出

输出


您不需要使用sed。使用basename命令可以相当容易地完成:

basename abc-2.25_20141104-1586.uvw.xyz .uvw.xyz
应该输出

abc-2.25_20141104-1586

您不需要使用sed。使用basename命令可以相当容易地完成:

basename abc-2.25_20141104-1586.uvw.xyz .uvw.xyz
应该输出

abc-2.25_20141104-1586
使用awk:

echo "abc-2.25_20141104-1586.uvw.xyz" | awk '{gsub('/\.uvw\.xyz/',"",$0); print $0}'
其他办法:

a="abc-2.25_20141104-1586.uvw.xyz"
echo ${a%.uvw.xyz}
输出:

abc-2.25_20141104-1586
使用awk:

echo "abc-2.25_20141104-1586.uvw.xyz" | awk '{gsub('/\.uvw\.xyz/',"",$0); print $0}'
其他办法:

a="abc-2.25_20141104-1586.uvw.xyz"
echo ${a%.uvw.xyz}
输出:

abc-2.25_20141104-1586

如果您只知道始终要删除由点分隔的最后两个占位符:

$ string="abc-2.25_20141104-1586.uvw.xyz" 
$ string=${string%.*}
$ echo ${string%.*}

如果您只知道始终要删除由点分隔的最后两个占位符:

$ string="abc-2.25_20141104-1586.uvw.xyz" 
$ string=${string%.*}
$ echo ${string%.*}
这里有一个很好的方法。它将删除任意长度的最后w字段

echo "abc-2.25_20141104-1586.uvwmore.xyzyes" | awk -F\. 'NF-=2' OFS=\.
abc-2.25_20141104-1586
这里有一个很好的方法。它将删除任意长度的最后w字段

echo "abc-2.25_20141104-1586.uvwmore.xyzyes" | awk -F\. 'NF-=2' OFS=\.
abc-2.25_20141104-1586

.uvw.xyz是任何字符的占位符,特别是u、v、w等,。。。。可能echo${a%.*.}.uvw.xyz是任何字符的占位符,而不是u、v、w、,。。。。也许echo${a%.*.}.uvw.xyz是任何字符的占位符,不特别是u、v、w,…。他在OP中没有说这一点——这可能意味着这一点——但按照它的措辞,我将OP解释为字面意思或硬编码的文件扩展名剥离。另外,文件扩展名虽然可能,但通常不会有太多不同的类型。这就是为什么你的答案没有被否决的原因。然而,一般来说,特别是从问题的上下文来看,它们显然是通用字符。总是尝试提供最普遍的解决方案作为答案。他在他的OP中没有这样说——除非你特别问他,否则我看不出你如何能直觉地理解他的意图。他说,uvw.xyz,可能有很多原因,有人可能会在公共论坛上的问题中泛化文件扩展名或其他数据,包括但不限于安全问题,但仍有意图询问特定的文件扩展名。David,感谢您的反馈。我以后会尽量说得更具体一些。但是A.Danischewski正确地假设,我希望用一个特定的扩展名来操作文件名,而不是非常具体地说明扩展名是什么。感谢您提供了简单的解决方案..uvw.xyz是任何字符的占位符,而不是具体的u、v、w等。他没有在OP中说这一点-这可能意味着这一点-但从措辞上看,我将OP解释为字面意思或硬编码的文件扩展名剥离。另外,文件扩展名虽然可能,但通常不会有太多不同的类型。这就是为什么你的答案没有被否决的原因。然而,一般来说,特别是从问题的上下文来看,它们显然是通用字符。总是尝试提供最普遍的解决方案作为答案。他在他的OP中没有这样说——除非你特别问他,否则我看不出你如何能直觉地理解他的意图。他说,uvw.xyz,可能有很多原因,有人可能会在公共论坛上的问题中泛化文件扩展名或其他数据,包括但不限于安全问题,但仍有意图询问特定的文件扩展名。David,感谢您的反馈。我以后会尽量说得更具体一些。但是A.Danischewski正确地假设,我希望用一个特定的扩展名来操作文件名,而不是非常具体地说明扩展名是什么。感谢您提供了简单的解决方案..uvw.xyz是任何字符的占位符,而不是特定的u、v、w,…..uvw.xyz是任何字符的占位符,而不是特定的u、v、w,…。如果第一个字符后面有字母,则此操作将失败。像这样:abc-2.25_20141104-1586A.uvwmore.xyzyest这会失败的第一个字母后面有字母。如下所示:abc-2.25_20141104-1586A.uvwmore.xyzyest如果最后两个字段中有一个包含多于或少于3个字符或包含数字,则该字段将失败。abc-2.25_20141104-1586.uvsw.xyz或abc-2.25_20141104-1586.uv3.xyz都将失败。@Jotne如果出现数字而不是字母以及许多其他情况,它也将失败。这个解决方案只处理OP指定的情况,为了处理其他更一般的情况,正则表达式显然会
e更改。如果最后两个字段中有一个包含多于或少于3个字符或包含数字,则此操作将失败。abc-2.25_20141104-1586.uvsw.xyz或abc-2.25_20141104-1586.uv3.xyz都将失败。@Jotne如果出现数字而不是字母以及许多其他情况,它也将失败。此解决方案仅处理OP指定的情况,要处理其他更一般的情况,正则表达式显然必须更改。最后两个字段中是否有数字,或者是否有多于/少于3个字符,如:abc-2.25_20141104-1586.uvsw.xyz或abc-2.25_20141104-1586.uv3.xyz?不管最后两个字段包含什么内容,都要删除它们吗?我意识到在某些情况下,最后两个字段中可能包含3个以上的字符。我可以通过修改这里发布的一些解决方案来解释这一点。当然,理想的解决方案是删除最后2个字段,不管它包含什么内容,但我暂时有我需要的。然后您应该查看哪个解决方案最适合您。得到你想要的东西的规则是什么。最后一个字段可以包含什么?数字,字母多少。最后要删除多少个字段?总是两个?在做一些编程时,我经常会看到很大的陷阱,如果没有足够的输入测试所有内容,就会出现错误。最后两个字段中是否有数字,或者是否有多于/少于3个字符,比如:abc-2.25_20141104-1586.uvsw.xyz或abc-2.25_20141104-1586.uv3.xyz?不管最后两个字段包含什么内容,都要删除它们吗?我意识到在某些情况下,最后两个字段中可能包含3个以上的字符。我可以通过修改这里发布的一些解决方案来解释这一点。当然,理想的解决方案是删除最后2个字段,不管它包含什么内容,但我暂时有我需要的。然后您应该查看哪个解决方案最适合您。得到你想要的东西的规则是什么。最后一个字段可以包含什么?数字,字母多少。最后要删除多少个字段?总是两个?在做一些编程时,我经常会看到很大的陷阱,如果没有用足够的输入测试所有东西,就会出现问题。