替换行中的单词(如果匹配)



我得到了一个文件。如果一行将"xxx"作为其第三个单词,那么我需要将其替换为"yyy"。我的最终输出必须包含所有原始行和修改后的行。输入文件是-

abc xyz mno
xxx xyz abc
abc xyz xxx
abc xxx xxx xxx

所需的输出文件应为-

abc xyz mno
xxx xyz abc
abc xyz yyy
abc xxx yyy xxx

我试过了——

grep "bxxxb" file.txt | awk '{if ($3=="xxx") print $0;}' | sed -e 's/[^ ]*[^ ]/yyy/3'

但这给出的输出是-

abc xyz yyy
abc xxx yyy xxx

遵循简单的awk可能会对您有所帮助。

awk '$3=="xxx"{$3="yyy"} 1'   Input_file

输出将如下所示。

abc xyz mno
xxx xyz abc
abc xyz yyy
abc xxx yyy xxx

说明:如果第三个字段等于字符串$3则在此处检查条件xxx然后将$3的值设置为字符串yyy。然后在那里提到1,因为awk在条件方法上工作,然后采取行动。我在这里通过在这里提及1而不是在这里提及任何操作来使条件为 TRUE,因此将发生当前行的默认打印(更改的第 3 个字段或新的第 3 个字段(。

sed解决方案:

sed -E 's/^(([^[:space:]]+[[:space:]]+){2})apathy>/1empathy/' file

输出:

abc xyz mno
apathy xyz abc
abc xyz empathy
abc apathy empathy apathy

要修改文件就地添加-i选项:sed -Ei ....

一般来说,awk命令可能看起来像

awk '{command set 1}condition{command set 2}' file

command set 1将针对每一行执行,而command set 2如果前面的条件为真,则将执行该行。

我的最终输出必须具有修改后的所有原始行 线

在您的情况下

 awk 'BEGIN{print "Original File";i=1}
      {print}
      $3=="xxx"{$3="yyy"}
      {rec[i++]=$0}
      END{print "Modified File";for(i=1;i<=NR;i++)print rec[i]}'file

应该解决这个问题。

解释

$3awk 中的第三个空格分隔字段。如果它与"xxx"匹配,则将其替换。首先打印未修改的行,同时将修改后的行存储在数组中。最后,打印修改后的行。 BEGINEND块分别在开头和结尾执行。 NR 是 awk 内置变量,表示到目前为止处理的记录数。由于它在END块中使用,因此它应该为我们提供记录总数。

都很好:-(

>Ravinder已经为您提供了最短的awk解决方案。

在 sed 中,以下内容将起作用:

sed -E 's/(([^ ]+ ){2})xxx/1yyy/'

或者,如果您的 sed 不包含 -E ,您可以使用更痛苦的 BRE 表示法:

sed 's/(([^ ][^ ]* ){2})xxx/1yyy/'

如果你有心情单独处理这个问题,这样的事情可能会起作用:

while read -r line; do
  read -r -a a <<<"$line"
  [[ "${a[2]}" == "xxx" ]] && a[2]="yyy"
  printf '%s ' "${a[@]}"
  printf 'n'
done < input.txt

相关内容

最新更新