【问题标题】:Enumerate substitutions with sed or awk用 sed 或 awk 枚举替换
【发布时间】:2010-10-27 07:21:42
【问题描述】:

给定带有行的纯文本文件

bli foo bla
 abc
 dfg
bli foo bla
 hik
 lmn

sed 或 awk 的魔法将其转换成什么

bli foo_01 bla
 abc
 dfg
bli foo_02 bla
 hik
 lmn

这样每次出现的 'foo' 都会被 'foo_[occurence number]' 替换。

【问题讨论】:

  • Michael,对要求的更多解释,尤其是输入格式是任何人试图有意义地回答这个问题所必需的......我想你已经把原本打算简化但真实世界文件的代表性样本......那个文件是什么?日志文件?一个mysql日志文件?只是一个猜测。干杯。基思。
  • 其实是一个java源文件,通过转换使方法名唯一
  • 大家好,感谢您的解决方案,我稍微修改了问题,在 foo 周围添加了一些噪音
  • 是的,当程序员只想完成某事时,他们如何求助于 perl、awk、nawk、ed、sed 和/或 tr,这不是很有趣吗 ;-)

标签: vim sed awk enumeration substitution


【解决方案1】:

这是表达拉杜洛夫答案的另一种方式

awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile

在查找“foo”时,请注意不要匹配“foobar”:

gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1' 

【讨论】:

    【解决方案2】:
    awk '!/foo/||sub(/foo/,"&_"++_)' infile
    

    Solaris 上使用 gawknawk/usr/xpg4/bin/awk

    【讨论】:

      【解决方案3】:

      这可能不是您需要的,但它可能会在正确的方向上提供一些想法。

      Administrator@snadbox3 ~
      $ cd c:/tmp
      
      Administrator@snadbox3 /cygdrive/c/tmp
      $ cat <<-eof >foo.txt
      > foo
      >  abc
      >  dfg
      > foo
      >  hik
      >  lmn
      > eof
      
      Administrator@snadbox3 /cygdrive/c/tmp
      $ awk '/^foo$/{++fooCount; print($0 "_" fooCount);} /^ /{print}' foo.txt
      foo_1
       abc
       dfg
      foo_2
       hik
       lmn
      

      编辑:

      我又迟到了一天,又少了一分钱;-(


      EDIT2:

      字符编码是另一件需要注意的事情...Java 源代码不一定采用系统默认编码...它已退出 UTF-8 编码,以允许任何嵌入的“高阶实体”;-) 许多*nix 实用程序仍然不能识别字符集。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2017-11-11
        • 2013-05-30
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多