我尝试在最后一个句点(点)之后提取子字符串。 以下示例。
echo "filename..txt"
应返回" txt" echo "filename.txt."
应该返回"" echo "filename"
应该返回"" echo "filename.xml"
应该返回" xml" 我在下面尝试过。但只有当字符(点)存在一次时才有效。但我的文件名可能有(点)0次或更多次。
echo "filename.txt" | cut -d "." -f2
答案 0 :(得分:3)
让我们使用awk -F"." '{print (NF>1)? $NF : ""}' file
!
.
这会将字段分隔符设置为$ cat file
filename..txt
filename.txt.
filename
filename.xml
$ awk -F"." '{print (NF>1)? $NF : ""}' file
txt
xml
并打印最后一个。但如果没有,它会打印一个空字符串。
getUseMedia
答案 1 :(得分:2)
可以通过以下方式使这个可移植(因此它不仅仅是Linux),避免了ERE依赖性:
$( "#close-button-landscape" ).click(function(e) {
e.stopPropagation();
alert( "close button click" );
});
$( "#container" ).click(function() {
alert( "container click" );
});
请注意,出于测试目的,我使用" here-string"在bash中。如果您的shell不是bash,请使用shell使用的任何内容将数据提供给sed。
这里重要的一点是使用了sed的$ sed -ne 's/.*\.//p' <<< "file..txt"
txt
$ sed -ne 's/.*\.//p' <<< "file.txt."
$ sed -ne 's/.*\.//p' <<< "file"
$ sed -ne 's/.*\.//p' <<< "file.xml"
xml
选项,该选项告诉它默认情况下不打印任何内容,并结合 s ubstitute命令&#39; s显式-n
标志,告诉sed在成功替换时仅打印 ,这显然需要在模式中包含一个点。
使用此解决方案,p
和"file.txt."
之间的区别在于前者返回替换为null的输入行(因此您可能仍会根据您的用法获得换行符),而后者返回没有,因为没有指示打印"file"
,因为输入中不包含sed
。当然,最终结果可能是相同的:
.
答案 2 :(得分:0)
简单地使用awk:
awk -F"." '{ print $NF }'
这是做什么的:用点作为分隔符,从输入中提取最后一个字段。
答案 3 :(得分:0)
分两步使用sed:首先删除没有点的字符串,然后删除最后一个点:
sed -e 's/^[^.]*$//' -e 's/.*\.//'
测试:
for s in file.txt.. file.txt. file.txt filename file.xml; do
echo "$s -> $(echo "$s" | sed -e 's/^[^.]*$//' -e 's/.*\.//')"
done
TestResult中:
file.txt.. ->
file.txt. ->
file.txt -> txt
filename ->
file.xml -> xml
实际上@ghoti的答案大致相同,只是更短(更好)。 其他想要用另一种语言做这样的事情的读者可以使用这个解决方案。