linux命令使用trim / cut / sed来剪切文件中的少量数据

linux命令使用trim / cut / sed来剪切文件中的少量数据

我的内容如下/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 foofoo.tar.gz

答案3

cut如果先反转每一行,则可以抓取最后一个元素,例如:

<filelist.txt rev | cut -d/ -f1 | rev

现在您可以像这样删除文件扩展名:

<filelist.txt rev | cut -d/ -f1 | rev | cut -d. -f1

巴什

此外cutsed你可以使用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该对象。extensionextension参数内,所识别的部分""不被替换(即被删除)。添加: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

相关内容