【问题标题】:select part of filename using regex使用正则表达式选择文件名的一部分
【发布时间】:2011-01-06 14:01:40
【问题描述】:

我得到了一个看起来像这样的文件

dcdd62defb908e37ad037820f7  /sp/dir/su1/89/asga.gz
7d59319afca23b02f572a4034b  /sp/dir/su2/89/sfdh.gz
ee1d443b8a0cc27749f4b31e56  /sp/dir/su3/89/24.gz
33c02e311fd0a894f7f0f8aae4  /sp/dir/su4/89/dfad.gz
43f6cdce067f6794ec378c4e2a  /sp/dir/su5/89/adf.gz
2f6c584116c567b0f26dfc8703  /sp/dir/su6/895/895.gz
a864b7e327dac1bb6de59dedce  /sp/dir/su7/895/895.gz

如何使用 sed 替换所有 su* 以便我可以用单个值替换,例如

sed "s/REXEXP/newfolder/g" myfile

提前致谢

【问题讨论】:

  • 您到底希望“输出”是什么?你必须使用sed吗?最后,以su 开头的目录是否总是采用su[0-9] 的形式? su[0-9]*?你也想去掉 md5 和吗?

标签: regex text sed unix


【解决方案1】:

我想你想要

sed 's/su./newfolder/g'

如果您确实想将su1...su7 中的号码作为newfolder 的一部分(例如newfolder1...newfolder7),您可以这样做:

sed 's/su\(.\)/newfolder\1/g'

这还取决于您希望自己的模式有多“严格”。以上将匹配su 后跟任何字符并进行替换。另一方面,像s#/su\([0-9]\)/#/newfolder\1/#g 这样的命令只会匹配/su 后跟一个数字,然后是/。所以你可能需要相应地调整你的模式。

【讨论】:

    【解决方案2】:
    $ sed -e 's|/su[^/]*|/newfolder|' /tmp/files\
    dcdd62defb908e37ad037820f7  /sp/dir/newfolder/89/asga.gz
    7d59319afca23b02f572a4034b  /sp/dir/newfolder/89/sfdh.gz
    ...
    

    如果你也想去掉校验和:

    $ sed -r -e 's|/su[^/]*|/newfolder|' -e 's/^[^ ]+ +//' /tmp/files\
    /sp/dir/newfolder/89/asga.gz
    /sp/dir/newfolder/89/sfdh.gz
    ...
    

    【讨论】:

    • 正如我在其他评论中所说,您不需要/ 作为s 的分隔符,因此您可以写:sed -e 's#/su[^/]*#/newfolder#' /tmp/files 以提高可读性。
    • 如果其中一个目录看起来像 /sp/su4dir/su1/89/24.gz 怎么办?
    • @ghostdog74:问题不是很明确,所以我们只能猜测OP真正需要什么模式。
    【解决方案3】:

    su[0-9] 将匹配一个数字。

    【讨论】:

      【解决方案4】:

      sed 需要大量元字符转义,其中一些可能会稍微偏离。

      sed -i -e 's/\/su[^\/]+\//\/newFolder\//g' myfile
      

      【讨论】:

      • 你不需要/s 之后的字符,所以你可以选择任何不在你的模式中的字符:所以,'sxsu[^/]+/x/newFolder/xg' 也是如此(如果我没有打错字)。
      • @Alok:谢谢你的提示,我一直都知道这在 perl 中是可能的,但没有意识到你应该在 SED 中这样做,非常有用,因为转义使 sed 正则表达式几乎不可读!
      • 当我将 + 更改为 .* 时它可以工作。此外,它不处理以下路径:/sp/su4dir/su1/89/24.gz
      【解决方案5】:

      我投票支持韦恩康拉德的答案,因为它最有可能是 OP 想要的,但我建议使用替代字符作为 sed 表达式分隔符,因此:

      sed 's|/su[^/]*|/newfolder|'  /tmp/files
      

      这样会更干净一些。

      另请注意,可能不需要结尾的“g”。

      【讨论】:

        【解决方案6】:

        使用 awk。因为有一个分隔符,您可以使用 '/'。之后,第 4 列是您要更改的内容。所以如果你有像 /sp/su3dir/su2/89/sfdh.gz 这样的路径,su3dir 不会受到影响。

        awk -F"/" '{$4="newfolder";}1' OFS="/" file
        

        【讨论】:

          猜你喜欢
          • 2018-11-29
          • 2019-01-29
          • 2015-06-06
          • 1970-01-01
          • 2021-12-28
          • 2016-03-26
          • 1970-01-01
          • 2013-08-24
          • 1970-01-01
          相关资源
          最近更新 更多