递归grep文本文件以过滤绝对路径

时间:2019-06-25 11:51:32

标签: bash awk sed grep

我有一个文本文件,其中有很多文件路径。我需要提取所有目录(不包括文件名和扩展名),并从中创建一个新的文本文件。 目录深度可能有所不同,磁盘驱动器标签也可能有所不同。

我需要保留重复的东西!

由于目录深度差异很大,因此不确定采取哪种路由:awk,sed,grep

Input (sample.txt):
C:\lolz\yoloz\thisisit.txt
D:\Windows\Programs\Others\Hell\gate.exe
D:\Windows\Programs\Others\Hell\rain.exe
E:\Auto\Plane\Boat\transport.ini

Expected output:
C:\lolz\yoloz
D:\Windows\Programs\Others\Hell
D:\Windows\Programs\Others\Hell
E:\Auto\Plane\Boat

4 个答案:

答案 0 :(得分:5)

这段简短的单行代码适用于您当前的示例:

sed 's/\\[^\\]\+$//' sample.txt

答案 1 :(得分:0)

这对我有用:

grep -o '[A-Z]\:[\\a-zA-Z0-9]*\\' sample.txt | sort  | uniq

说明:
以驱动器号开头:[A-Z],后跟冒号\:
旁边是反斜杠,字母和数字的列表[\\a-zA-Z0-9]*
它必须以反斜杠结尾,以获取目录\\

显然,为了使其正常工作,您需要单引号。

grep -o用于过滤grep输出。

sort | uniq用于删除重复项。

答案 2 :(得分:0)

或者是没有外部工具的纯bash解决方案

while read -r line || [[ ${line} ]]; do
  [[ ${line} =~ (.*)\\[^\\]* ]]
  echo "${BASH_REMATCH[1]}"
done

答案 3 :(得分:0)

awk '{sub(/.{9}$/,"")sub(/\\t.?../,"")}1' file

C:\lolz\yoloz
D:\Windows\Programs\Others\Hell
D:\Windows\Programs\Others\Hell
E:\Auto\Plane\Boat