我正在编写一个bash shell脚本来输出文件名的后缀。
在这种情况下,我使用:
sed 's|.*\.||'
所以输出例如:
png
exe
c
但是,如果文件名没有后缀,因此也没有点怎么办?我的输出应为“无后缀”,但我不知道该如何使用sed。
编辑 我已经尝试过的:
目录:
abc.x
abc.y
abc
输入:
find . -type f | sed -E 's/^[^.]+$/no suffix/; s/.*\.//'
输出:
x
y
/abc
答案 0 :(得分:2)
使用2个连续替换:
sed -E 's/^[^.]+$/no suffix/; s/.+\.//'
答案 1 :(得分:0)
awk中的一个。首先,一些未提供的测试材料:
$ cat foo
this.foo
that.bar
nothing
awk:
$ awk '{n=split($0,a,".");print (n>1?a[n]:"no suffix")}' foo
foo
bar
no suffix
答案 2 :(得分:0)
怎么样
sed '/.*\./s///;t;s/.*/no suffix/'
正则表达式用点将线匹配。在这些行上,我们执行替换。如果发生替换,我们就完成了。否则,执行其他替换。
在替换模式中使用空正则表达式将使用以前的模式。如果发生替换,t
命令分支;没有参数,我们跳转到脚本的末尾。 (否则,您可以使用:label
设置标签,然后使用tlabel
转到该标签。)
答案 3 :(得分:0)
$ cat file
abc.x
abc.y
abc
$ awk -F'.' '{print (NF>1 ? $NF : "no suffix")}' file
x
y
no suffix
答案 4 :(得分:0)
您可以使用POSIX shell 参数扩展来完成相同操作,而无需调用单独的实用程序。例如,要测试文件是否包含'.'
,您可以简单地使用test
,例如:
[ "$i" = "${i%.*}" ]
请参见Posix Programmer's Manual - Shell Command Language - Parameter Expansion
如果测试为TRUE,则不存在扩展名,否则,您可以使用其他 parameter扩展来获取扩展名本身,例如
[ "$i" = "${i%.*}" ] && echo "$i - no suffix" || echo "$i - ${i##*.}"
(注意:,您将需要进行其他测试以排除.foo
(例如 dotfiles ),但这留给您)
将其循环包装并排除目录文件,您可以测试目录中的每个文件,也可以在循环中使用read
并将名称列表通过管道传递给它。例如,循环遍历目录中的文件将导致:
...
ftlcdfil.c - c
geany-plugin_build_w_gtk+2.patch - patch
geany-plugins.spec - spec
geany.spec - spec
geany_build_w_gtk+2.patch - patch
getfl - no suffix
gtkw_save_test.txt - txt
gtkwrite-master.zip - zip
helloleap - no suffix
helloleap.c - c
jnl - no suffix
messages - no suffix
opensuse_15.0_1s_delay.svg - svg
...
答案 5 :(得分:0)
使用Perl
/tmp> ls ab*
abc abc.x abc.y
/tmp> perl -e ' print /\./? "$_\n" : "no suffix\n" for(glob("ab*")) '
no suffix
abc.x
abc.y
/tmp>