在某些间隔编号的替换

时间:2017-09-12 14:43:19

标签: awk sed

我希望有一些简单的sed命令,当应用于

类型的标准输出时
\partie
{Méthode}
{Méthode} 

\partie
{Méthode} 
{Méthode} 

\partie
{Méthode}
{Méthode}
{Méthode}

\partie
{Méthode}

...将其转换为

\partie
{Méthode 1}
{Méthode 2} 

\partie
{Méthode 1} 
{Méthode 2} 

\partie
{Méthode 1}
{Méthode 2}
{Méthode 3}

\partie
{Méthode 1}

据我所知,awk允许在每个“Méthode”之后插入数字,但是如何在“\ partie”出现后将计数器重新置于1?

4 个答案:

答案 0 :(得分:2)

使用 awk

awk '/\partie/{c=0}/^\{/{sub(/\}/," "++c"&")}1' infile

<强>解释

awk '/\partie/{c=0}/^\{/{sub(/\}/," "++c"&")}1' infile
         ^      ^    ^        ^              ^
         |      |    |        |              |
         |      |    |        |         1 at end does default operation print current record/line/row that is print $0
         |      |    |     substitute } with space followed by variable c value and matched regexp
         |      |    |
         |      |  look for line starts with {
         |      |
         |   reset variable c
         |
      search for line with \partie

来自doc

  

如果替换中出现特殊字符'&amp;',则代表   由regexp匹配的精确子字符串。 (如果正则表达式匹配   不止一个字符串,那么这个精确的子字符串可能会有所不同。)

<强>输入

$ cat infile
\partie
{Méthode}
{Méthode} 

\partie
{Méthode} 
{Méthode} 

\partie
{Méthode}
{Méthode}
{Méthode}

\partie
{Méthode}

<强>输出

$ awk '/\partie/{c=0}/^\{/{sub(/\}/," "++c"&")}1' infile
\partie
{Méthode 1}
{Méthode 2} 

\partie
{Méthode 1} 
{Méthode 2} 

\partie
{Méthode 1}
{Méthode 2}
{Méthode 3}

\partie
{Méthode 1}

答案 1 :(得分:0)

awk

$ cat tst.awk
/\partie/{ p=0 }
/Méthode/ && sub(/}/, " " ++p "}"){}1

说明:

/\partie/{ p=0 }       # if the line read ($0) matches `\partie` 
                       # set variable p to 0

接下来,如果

/Méthode/              # if the line read matches `Méthode`
&&                     # AND
sub(/}/, " " ++p "}")  # substitite "}" with 
                       # concat of "space, pre-increment of p and }"
                       # in $0 succeeds
{}                     # do nothing
1                      # print $0          

让我们试试命令行

$ less input.txt | awk '/\partie/{ p=0 } /Méthode/ && sub(/}/, " " ++p "}"){}1'

在input.txt中输入:

$ cat input.txt
\partie
{Méthode}
{Méthode}

\partie
{Méthode}
{Méthode}

\partie
{Méthode}
{Méthode}
{Méthode}

\partie
{Méthode}

或将其称为脚本:

$ awk -f tst.awk input.txt
\partie
{Méthode 1}
{Méthode 2}

\partie
{Méthode 1}
{Méthode 2}

\partie
{Méthode 1}
{Méthode 2}
{Méthode 3}

\partie
{Méthode 1}

答案 2 :(得分:0)

awk 解决方案:

awk -F'}' '/\partie/{ c=0 }/Méthode/{ print $1,++c"}"; next }1' file
  • -F'}' - 可选/辅助字段分隔符

  • /\partie/{ c=0 } - 在每次\partie次出现时重置计数器

答案 3 :(得分:0)

$ awk '{sub(/}/," "c++"&")} !NF{c=0} 1' file
\partie
{Méthode 1}
{Méthode 2}

\partie
{Méthode 1}
{Méthode 2}

\partie
{Méthode 1}
{Méthode 2}
{Méthode 3}

\partie
{Méthode 1}