【问题标题】:Grep a text file recursively to filter absolute paths递归地grep文本文件以过滤绝对路径
【发布时间】:2019-06-25 11:51:32
【问题描述】:

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

我需要保留副本!!!

由于目录深度差异很大,不确定采用哪条路径: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

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:

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

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

    【讨论】:

    • @SyntycheAckerley 你应该接受最有用的答案。
    • 您应该提到,\+ 需要 GNU sed,或者只使用 * 代替所有 sed 的可移植性。
    • @yoga 这是一个非常基础的正则表达式,你对哪一部分理解有问题?
    • @yoga 我无法解释所有的正则表达式对不起,或者我正在写一个教程。不过你可以查这个,有例子:medium.com/factory-mind/…
    • 感谢您的努力
    【解决方案2】:

    这是为我做的:

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

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

    显然,为了使它起作用,您需要单引号。

    grep -o 用于过滤 grep 输出。

    sort | uniq 用于删除重复项。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        awk '{sub(/.{9}$/,"")sub(/\\t.?../,"")}1' file
        
        C:\lolz\yoloz
        D:\Windows\Programs\Others\Hell
        D:\Windows\Programs\Others\Hell
        E:\Auto\Plane\Boat
        

        【讨论】:

          猜你喜欢
          • 2011-03-21
          • 2014-02-09
          • 2011-07-09
          • 1970-01-01
          • 2012-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多