提取匹配特定模式的行+附加操作

  • 本文关键字:操作 模式 提取 awk sed grep
  • 更新时间 :
  • 英文 :


给定一个目录和/或文件路径列表,我想提取包含文件名与给定模式匹配的文件的目录路径,例如具有.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/

最新更新