afrin Asked: 2023-06-01 19:01:43 +0800 CST2023-06-01 19:01:43 +0800 CST 2023-06-01 19:01:43 +0800 CST linux 命令使用 trim / cut / sed 来剪切文件中的少量数据 772 我有如下内容/tmp/myfileslist test1/a/sample1.xls test2/demo.sh 我想在斜杠之前删除 .extentions 和内容,同时要删除斜杠。我希望输出为 sample1 demo text-processing 4 个回答 Voted Best Answer αғsнιη 2023-06-01T19:23:10+08:002023-06-01T19:23:10+08:00 With awk(并且假定您的记录中没有重复的点/path/to/some.example.txt后缀,例如它将仅返回“ example ”部分) awk -F'[/.]' '{ print $(NF-1) }' infile 如果您有这样的记录,请改用下面的内容。 awk -F'/' '{ sub(/.[^.]*$/, ""); print $NF }' infile Philippos 2023-06-01T19:21:31+08:002023-06-01T19:21:31+08:00 您的cut方法存在字段数逐行变化的问题。 另请注意,“您不应使用cat管道”,而是将文件名作为属性提供给您的文本处理命令。 分两步删除斜线 ( .*/) 之前的所有内容,然后删除从点 ( \..*) 开始的所有内容: sed 's_.*/__;s_\..*__' /tmp/myfilelist (这假定您要删除所有扩展名并且只需要 of foo。foo.tar.gz) Thor 2023-06-01T19:51:45+08:002023-06-01T19:51:45+08:00 切 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%%.*}删除所有扩展名。 jubilatious1 2023-06-02T02:55:34+08:002023-06-02T02:55:34+08:00 使用Raku(以前称为 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 示例来源: https ://unix.stackexchange.com/a/731665/227738
With
awk
(并且假定您的记录中没有重复的点/path/to/some.example.txt
后缀,例如它将仅返回“ example ”部分)如果您有这样的记录,请改用下面的内容。
您的
cut
方法存在字段数逐行变化的问题。另请注意,“您不应使用
cat
管道”,而是将文件名作为属性提供给您的文本处理命令。分两步删除斜线 (
.*/
) 之前的所有内容,然后删除从点 (\..*
) 开始的所有内容:(这假定您要删除所有扩展名并且只需要 of
foo
。foo.tar.gz
)切
cut
如果先反转每一行,则可以获取最后一个元素,例如:现在您可以像这样删除文件扩展名:
狂欢
此外
cut
,sed
您可以使用bash 参数扩展来删除路径文件扩展名,例如:提示:用于
${f%%.*}
删除所有扩展名。使用Raku(以前称为 Perl_6)
示例输入:
示例输出:
简而言之,使用非自动打印的逐行标志逐行读取文件
-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
示例来源:
https ://unix.stackexchange.com/a/731665/227738