我的内容如下/tmp/myfileslist
test1/a/sample1.xls
test2/demo.sh
我想在斜杠之前删除 .extentions 和内容,斜杠也将被删除。我希望输出为
sample1
demo
答案1
与awk
(并且假设没有重复点您的记录中的后缀,例如/path/to/some.example.txt
它将返回“例子仅“部分)
awk -F'[/.]' '{ print $(NF-1) }' infile
如果您有这样的记录,请改为使用下面的记录。
awk -F'/' '{ sub(/.[^.]*$/, ""); print $NF }' infile
答案2
您的cut
方法存在字段数随行而变化的问题。
另请注意,“您不应使用管道cat
”,而是将文件名作为文本处理命令的属性。
分两步删除斜线 ( .*/
) 之前的所有内容,然后删除点 ( \..*
) 开始的所有内容:
sed 's_.*/__;s_\..*__' /tmp/myfilelist
(这假设您要删除所有扩展名并且只需要 of foo
。foo.tar.gz
)
答案3
切
cut
如果先反转每一行,则可以抓取最后一个元素,例如:
<filelist.txt rev | cut -d/ -f1 | rev
现在您可以像这样删除文件扩展名:
<filelist.txt rev | cut -d/ -f1 | rev | cut -d. -f1
巴什
此外cut
,sed
你可以使用bash参数扩展删除路径文件扩展名,例如:
while read f; do
f="${f##*/}"
f="${f%.*}"
printf '%s\n' "$f"
done < filelist.txt
提示:用于${f%%.*}
删除所有扩展。
答案4
使用乐(以前称为 Perl_6)
~$ raku -ne 'put .IO.extension("").basename;' file
#OR (below handles up to 8-part extensions):
~$ raku -ne 'put .IO.extension("", :parts(^9)).basename;' file
输入示例:
/test1/a/sample1.xls
/test2/demo.sh
/some/file.txt
/whatever/prog.c
/something/abc.tar.bz
/something/abc.123.456.789.tar.bz
/something/abc.c
/something/abc.h
/path/to/file.10.5.2.tar.gz
/path/to/file.10.5.2.tar.gz.whatever
/path/to/file.10.5.2.tar.gz.whatever.7.pdf
/noextension
示例输出:
sample1
demo
file
prog
abc
abc
abc
abc
file
file
file
noextension
简而言之,使用非自动打印逐行标志逐行读取文件-ne
。代码在每一行上运行:首先,路径被解释为一个对象,可以识别/修改IO
该对象。extension
在extension
参数内,所识别的部分""
不被替换(即被删除)。添加:parts
参数(又名“副词”)允许多部分文件扩展名识别。最后,将其basename
隔离,删除路径的所有部分——斜杠及以上。
注意,因为 Raku 可以通过操作系统特定的设置来理解文件路径,所以上面的代码应该管用在 Windows 上未经修改,以从 Windows 路径中提取正确的元素(Raku 将反斜杠理解为 Windows 操作系统上的路径分隔符)。
https://docs.raku.org/type/IO/Path
https://docs.raku.org/routine/basename
https://docs.raku.org/routine/extension
https://raku.org