【问题标题】:extract sub expression with sed用 sed 提取子表达式
【发布时间】:2010-08-16 17:10:03
【问题描述】:

我有一个从 /root 开始的目录列表。比如

随机文本 /root/dir1/files 随机结束

删除我 /root/dir1/files/2dir 我是废物

/root/examples/source alalalala

/root/example/header 一些其他文本

我想使用 sed 从目录的每一行中取出并删除其他所有内容。我的最终输出必须是

/root/dir1/文件

/root/dir1/files/2dir

/root/examples/source

/root/example/header

我该怎么做? (提取从 /root 开始的所有内容...直到路径的末尾)

【问题讨论】:

  • 你有没有尝试过?

标签: linux unix shell sed


【解决方案1】:

给你:

sed 's|^[^/]*\(/[^ ]*\).*$|\1|'

这假定文件名中没有空格,并且行上的第一个“/”标记文件名的开始。

修改为:

sed -n 's|^[^/]*\(/[^ ]*\).*$|\1|p'

只输出匹配模式的行(没有空行)。

【讨论】:

    【解决方案2】:

    为了完整起见,我还提供了其他几种语言的解决方案:

    重击

    while read LINE; do
      X=${LINE#*/}
      X=${X%% *}; 
      [ "$X" == "" ] || echo /$X
    done  
    

    Perl

     perl -ne '/(\/root[^ ]+)/ and print "$1\n"'
    

    卢阿

    #!lua
    while true do
      local line = io.read()
      if line == nil then break end
      s = string.match(line,"/root[^%s]+")
      if s then print(s) end
    end
    

    【讨论】:

      【解决方案3】:
      awk '{for(i=1;i<=NF;i++) if ($i ~/\/root/) {print $i} }' file
      

      【讨论】:

        【解决方案4】:

        另一个编辑:似乎我对这个问题的初步评估并没有像它应该有的那样仔细阅读它。感谢下面的评论,我学到了一些技巧,并且可以清除这个答案。

        首先,tylerl 已经在this answer 中的 sed 中显示了一个应该适用于此的命令。巧妙的技巧,不过我可能会为此坚持使用 awk。

        我自己的解决方案没有考虑描述中给出的前几行。 ghostdog74 提供了一个可行的解决方案 here。

        看看上面链接的解决方案。

        【讨论】:

        • 当你使用awk/nawk时,不需要使用sed。 nawk '/^\/root/{print $1}'。人们经常有一个错误的印象,认为 sed 和 awk 可以一起工作,而事实上,awk 就足够了。
        • Sed 也会这样做。 perl 也一样。就像 bash 一样。就像 python... 等等。Awk 不是“你在寻找什么”,而是“另一个可以工作的工具”。
        • @ghostdog74 这更干净,非常好。 @tylerl 我不知道 sed 的功能。在下面支持您的答案,因为它直接回答了 OP 的问题。
        • 前两行打印“随机”和“删除”或不打印。它没有做OP想要的。我不知道为什么它被接受了。
        • 我也不确定这个答案是如何被接受的。我已经更新了以下两个解决方案的链接,这两个解决方案都更严格地适用于上述问题。答案也来自社区 Wiki。
        猜你喜欢
        • 2013-06-03
        • 2011-02-07
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        相关资源
        最近更新 更多