Awk 按一定间隔编号的替换

Awk 按一定间隔编号的替换,awk,sed,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éth

我希望有一些简单的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

$ cat tst.awk
/\partie/{ p=0 }
/Méthode/ && sub(/}/, " " ++p "}"){}1
$ less input.txt | 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          
让我们试试这个命令行:

$ cat tst.awk
/\partie/{ p=0 }
/Méthode/ && sub(/}/, " " ++p "}"){}1
$ 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}
awk解决方案:

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

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


    • 使用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
      
      发件人:

      如果替换中出现特殊字符“&”,则表示 由regexp匹配的精确子字符串。(如果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}
      
      输出

      $ 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}
      

      多亏了大家,我不可能有一个更快更清晰的答案。这是我的第一个问题,当然不是最后一个!不客气,看看下一步怎么办