给定一个目录和/或文件路径列表,我想提取包含文件名与给定模式匹配的文件的目录路径,例如具有.txt
扩展名的文件。
示例输入文件:
/a/b/c/d.txt
/a/b/c/d/e.txt
f
g
h/i
/a/b/c.txt
预期输出:
/a/b/c/
/a/b/c/d/
/a/b/
我如何用Linux命令行工具做到这一点?我想知道以下是不是一个好的开始:
grep ".txt" foo | <what else?>
(假设期望的输出在第二行和第三行末尾有一个/
,否则它与第一行输出不一致…)
看这个:
sed -En '/.txt$/s!(.*/).*!1!p' foo
,
-E
是用(
和)
代替(
和)
进行分组-n
告诉Sed默认不打印模式空间/.txt$/
只匹配以.txt
结尾的行s
在/.txt$/
匹配的行上运行替换!
被用来代替/
作为分隔符,因为这样我们就不必转义/
(.*/).*
匹配整行,但只捕获到并包括最后一个/
1
用我们捕获的部分替换行p
标志告诉Sed打印 行
可以使用
awk -F/ '$NF ~ /.txt$/{$NF="";print}' OFS=/ file
细节:
-F/
-将字段分隔符设置为正斜杠$NF ~ /.txt$/
-如果最后一个字段文本以.txt
结尾…{$NF="";print}
-然后将最后一个字段文本归零并打印结果…OFS=/
-与/
连接字段,而不是默认空格。
查看在线演示:
#!/bin/bash
s='/a/b/c/d.txt
/a/b/c/d/e.txt
f
g
h/i
/a/b/c.txt'
awk -F/ '$NF ~ /.txt$/{$NF="";print}' OFS=/ <<< "$s"
输出:
/a/b/c/
/a/b/c/d/
/a/b/
这个sed
工作吗?
sed 's#(.*/).*#1#;/^[a-z]/d' input_file
$ sed 's#(.*/).*#1#;/^[a-z]/d'
/a/b/c/
/a/b/c/d/
/a/b/