【问题标题】:How can I remove all characters in each line after the first space in a text file?如何删除文本文件中第一个空格后每行中的所有字符?
【发布时间】:2012-11-15 19:41:19
【问题描述】:

我有一个大的日志文件,我需要从中提取文件名。

文件如下所示:

/path/to/loremIpsumDolor.sit /more/text/here/notAlways/theSame/here
/path/to/anotherFile.ext /more/text/here/differentText/here
.... about 10 million times

我需要像这样提取文件名:

loremIpsumDolor.sit
anotherFile.ext

我认为我的第一个策略是用 '' 查找/替换所有 /path/to/。但我不知道如何删除空格后的所有字符。

你能帮忙吗?

【问题讨论】:

    标签: regex string bash shell text-manipulation


    【解决方案1】:
    sed 's/ .*//' file
    

    不再需要了。当然,转换后的输出会出现在标准输出上。

    【讨论】:

    • umm... 正则表达式用于在第一个空格后剥离?没想到你会这样;-)
    • 蛮力sed动作;我喜欢。遗憾的是,Windows 默认没有提供像 sed、grep、awk 等这样强大的文本操作工具。这些是系统管理员(恕我直言)的基本工具。
    • 我不喜欢“剪切”,因为它的标准 (POSIX) 版本不处理字段之间的一个或多个分隔符; GNU cut 有必要的 -i 选项,但我不能总是依赖 GNU cut 可用。当然,这个特定任务不是问题,但如果你不使用工具,因为它并不总是有效,你就不要使用它。我发现sed 更易于使用,但有多种工具可以完成这项工作(awkperlpython 都可以很容易地使用,但它们比必要的复杂。
    • @JonathanLeffler,我发现sed 更复杂对于这个特定的任务。这就是为什么我没想到你会这样。 (并且没有任何工具始终有效)。也就是说,无论预期与否,我都没有发现这个解决方案有任何严重错误;-)
    【解决方案2】:

    理论上,您也可以使用awk 从每一行中获取文件名:

    awk '{ print $1 }' input_file.log
    

    当然,这假设任何文件名中都没有空格。 awk 默认查找空格作为字段分隔符,因此上面的 sn-p 将从日志文件(您的文件名)中为每一行获取第一个“字段”,并输出它。

    【讨论】:

    • 啊,但是我的真实日志文件之前确实有空格。但我喜欢这个方向。实际上它更像textHere thenSpaces /path/to/file.ext /more/text/here。我没有提到它,因为我认为无论如何我都必须 sed 查找/替换第一部分(因为它总是相同的)。
    • @Ryan:没有汗水;您只需使用print $2,因为它将成为第二个字段。 awk 是处理此类事情的便捷工具,值得熟练使用它。
    【解决方案3】:

    传递给cut:

    cut '-d ' -f1 yourfile
    

    【讨论】:

    • 你不需要输入重定向,虽然它在这里没有害处,因为只有一个文件需要处理。
    • @JonathanLeffler,是的。提交后也想起来了。我会编辑它。
    【解决方案4】:

    仅限 bash 的解决方案:

    while read path otherstuff; do
        echo ${path##*/}
    done < filename
    

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2015-08-23
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2021-06-20
      相关资源
      最近更新 更多