获取字符串中每个路径的txt文件名

问题描述 投票:0回答:3

我正在尝试在 bash 中使用以下命令来提取目录 my-repo/text/*/.txt 中的 txt 文件名

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" | sed -E 's|my-repo/text/.*/([^/]+)\.txt|\1|g'

但我得到以下输出:

my-file
,而我需要的输出是
der
er_abc
my-file

有办法做到这一点吗?

bash sed
3个回答
0
投票

要按照您的描述提取文件名,您可以使用以下 bash 命令:

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" | grep -oP 'my-repo/text/.*?/\K[^/]+(?=\.txt)'

0
投票

您可以使用这个

tr | sed
解决方案:

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" |
tr ' ' '\n' |
sed -E '/\.txt$/!d; s|my-repo/text/[^ ]+/([^/.]+)\.txt|\1|g'

der
er_abc
my-file

0
投票

使用这个 Perl 一行代码:

echo "my-repo/text/level1_dir/der.txt my-repo/scripts/af.py my-repo/text/level1_dir/another/er_abc.txt my-repo/text/deep/nested/my-file.txt" | perl -lane 'print join " ", map { m{([^/]+)[.]txt$} } @F;'

Perl 单行代码使用这些命令行标志:

-e
:告诉 Perl 查找内联代码,而不是在文件中。
-n
:一次循环输入一行,默认将其分配给
$_

-l
:在内联执行代码之前删除输入行分隔符(默认情况下在 *NIX 上为
"\n"
),并在打印时附加它。
-a
:在空格或
$_
选项中指定的正则表达式上将
@F
拆分为数组
-F

map { m{([^/]+)[.]txt$} } @F
:对于数组
@F
的每个元素(=每个路径),将匹配中捕获的字符串(如果有)返回到正则表达式
([^/]+)[.]txt$

([^/]+)[.]txt$
:捕获
.txt
文件的基本名称。
([^/]+)
:除“/”(斜杠)之外的任何字符出现 1 次或多次,该字符被捕获(使用括号)并返回。
[.]
:文字点。
txt$
:
txt
字符串后跟行尾。

另见:

© www.soinside.com 2019 - 2024. All rights reserved.