我正在尝试在 bash 中使用以下命令来提取目录 my-repo/text/*/
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 命令:
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)'
您可以使用这个
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
使用这个 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
字符串后跟行尾。
另见: