Bash - 从字符串中提取文件名和扩展名

时间:2013-06-06 16:54:57

标签: bash

这是grep命令:

grep "%SWFPATH%/plugins/" filename 

及其输出:

set(hotspot[hs_bg_%2].url,%SWFPATH%/plugins/textfield.swf);
set(hotspot[hs_%2].url,%SWFPATH%/plugins/textfield.swf);
url="%SWFPATH%/plugins/textfield.swf"
url="%SWFPATH%/plugins/scrollarea.swf"
alturl="%SWFPATH%/plugins/scrollarea.js"
url="%SWFPATH%/plugins/textfield.swf"

我想生成一个文件,其中包含'plugins /'目录中所有文件的名称,这些文件在某个文件中提到。

基本上我需要从每一行提取文件名和扩展名。 我可以设法删除任何重复项,但我无法弄清楚如何提取我需要的信息。

这将是我想要获得的文件的内容:

textfield.swf
scrollarea.swf
strollarea.js

感谢!!!

PS:线程“在bash中提取文件名和扩展名(14个答案)”解释了如何从'变量'获取文件名和扩展名。我想要实现的是从'文件'中提取这些,这是完全不同的'

3 个答案:

答案 0 :(得分:2)

使用 awk

grep "%SWFPATH%/plugins/" filename | \
awk '{ match($0, /plugins\/([^\/[:space:]]+)\.([[:alnum:]]+)/,submatch);
     print "filename:"submatch[1];
     print "extension:"submatch[2];
    }'

一些解释:

match函数接受由awk处理的每一行(由$0表示)并查找与该正则表达式的匹配项。子匹配(字符串中与括号内正则表达式部分匹配的部分)保存在数组submatch中。 print看起来很简单,只是打印东西。

答案 1 :(得分:1)

针对此特定问题

awk '/\/plugins\// {sub(/.*\//, ""); sub(/(\);|")?$/, "");
   arr[$0] = $0} END {for (i in arr) print arr[i]}' filename

答案 2 :(得分:1)

使用awk简单地提取文件名,然后使用sed清除尾随符号“;;字符。

 awk -F/ '{print $NF}' a  | sed -e 's/);//' -e 's/"$//'