在字符后提取子字符串

时间:2015-12-30 22:42:18

标签: linux unix sed substring cut

我尝试在最后一个句点(点)之后提取子字符串。 以下示例。

  • echo "filename..txt"应返回" txt"
  • echo "filename.txt."应该返回""
  • echo "filename"应该返回""
  • echo "filename.xml"应该返回" xml"

我在下面尝试过。但只有当字符(点)存在一次时才有效。但我的文件名可能有(点)0次或更多次。

echo "filename.txt" | cut -d "." -f2

4 个答案:

答案 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的答案大致相同,只是更短(更好)。 其他想要用另一种语言做这样的事情的读者可以使用这个解决方案。