sed:用匹配的模式替换第n个单词?

way*_*ast 5 regex bash perl awk sed

我有一个具有以下特征的文本文件:

  1. 每行至少有三个由空格分隔的"单词"
  2. "单词"可以是任何字符或字符串

我已经在一些行中添加了一些注释,并提供了对原始单词进行更改的暂时建议,现在我想使用sed为我做出这些更改.所以,为了给出更清晰的图片,我的文件看起来像这样:

NO NO O
SIGNS NN O      #NNS
GIVEN VBD B-VP  #VBN
AT IN O
THIS NN O       
TIME NN O            ## B-NP
. PER O
...
Run Code Online (Sandbox Code Playgroud)

1#的注释用于替换行中的SECOND字,用2#的注释用于替换行中的THIRD字.有人能用sed(或awk,或其他任何东西)建议一种方法吗?再次澄清(希望如此),我的目标是获得#或##之后的模式,并用匹配的模式替换该行的第n个单词.

谢谢.

Sie*_*geX 4

这对你有用:

awk '/#/{sub(/# +/,"#");n=gsub(/#/,"",$NF);$(n+1)=$NF;$NF="\t\t#"}1' file
Run Code Online (Sandbox Code Playgroud)

解释

  1. /#/{ ... }:搜索包含#并执行以下步骤的行...
  2. sub(/# +/,"#"):删除注释和注释之间的所有空格#(如有必要)
  3. n=gsub(/#/,"",$NF):删除#最后一个字段中的所有内容$NF,并将#删除的个数设置为变量n
  4. $(n+1)=$NF:将n+1字段设置$(n+1)为新的最后一个字段$NF,该字段已全部#剥离
  5. $NF="\t\t#":将最后一个字段设置$NF为两个选项卡,后跟一个#
  6. 1:告诉awk打印更改后的行的快捷方式
  7. file:您的输入文件

例子

$ awk '/#/{sub(/# +/,"#");n=gsub(/#/,"",$NF);$(n+1)=$NF;$NF="\t\t#"}1' file
NO NO O
SIGNS NNS O             #
GIVEN VBN B-VP          #
AT IN O
THIS NN O
TIME NN B-NP            #
. PER O
...
Run Code Online (Sandbox Code Playgroud)

注意:如果您的注释始终跟#在 之间且中间有零个空格,则可以删除sub(/# +/,"#");命令的整个部分以使其更短