Awk 按一定间隔编号的替换
我希望有一些简单的sed命令,当应用于类型的标准输出时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
\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}
多亏了大家,我不可能有一个更快更清晰的答案。这是我的第一个问题,当然不是最后一个!不客气,看看下一步怎么办