Bash 如果匹配,则替换行中的一个字

Bash 如果匹配,则替换行中的一个字,bash,awk,sed,Bash,Awk,Sed,我得到了一份文件。如果一行的第三个字是“xxx”,那么我需要将其替换为“yyy”。我的最终输出必须包含所有原始行和修改后的行。 输入文件是- 所需的输出文件应为- 我试过了- grep "\bxxx\b" file.txt | awk '{if ($3=="xxx") print $0;}' | sed -e 's/[^ ]*[^ ]/yyy/3' 但这将输出为- abc xyz yyy abc xxx yyy xxx 通常,awk命令可能如下 awk '{command set 1}con

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

所需的输出文件应为-

我试过了-

grep "\bxxx\b" file.txt | awk '{if ($3=="xxx") print $0;}' | sed -e 's/[^ ]*[^ ]/yyy/3'
但这将输出为-

abc xyz yyy
abc xxx yyy xxx

通常,
awk
命令可能如下

awk '{command set 1}condition{command set 2}' file
如果前面的条件为真,则将对每行执行
命令集1
,同时执行
命令集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
awk'开始{打印“原始文件”;i=1}
{print}
$3==“xxx”{$3=“yyy”}
{rec[i++]=$0}

结束{打印“修改文件”;对于(i=1;i
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 '$3=="xxx"{$3="yyy"} 1'   Input_file
输出如下

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

说明:如果
$3
第三个字段等于string
xxx
,则在此处检查条件,然后将
$3
的值设置为string
yyyy
。然后在此处提及
1
,因为
awk
工作于条件方法,然后执行操作。我通过提及
1
来实现条件>此处未提及任何操作,因此将进行当前行的默认打印(使用已更改的第三个字段或新的第三个字段)。

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

在sed中,以下各项将起作用:

sed -E 's/(([^ ]+ ){2})xxx/\1yyy/'
或者,如果您的sed不包含
-E
,您可以使用更痛苦的BRE表示法:

sed 's/\(\([^ ][^ ]* \)\{2\}\)xxx/\1yyy/'
如果您有心情单独在bash中处理此问题,类似的方法可能会奏效:

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

read-r-a这个网站不是为了做你的工作,而是为了帮助你做一些你尝试过但遇到困难的事情。因此,请添加你的提问尝试。另外,添加示例输入/输出也会有帮助。
awk | grep | sed
是一个糟糕的组合。
:-/
谢谢添加你的尝试。。建议您继续(其他人用sed/grep替换awk)-有很多免费资源可以帮助您通过示例学习这些工具…您与
awk'{if($3==“xxx”)print$0;}'
非常接近,但不知道如何修改它以适应您的用例。。愉快的学习:)单调乏味,不是吗?
;-)
++为什么不使用量词?这样它也会是通用的,更改数字以指定column@Sundeep,更确切地说,当谈论“quatifier”时quantifiers@sjsam,是的,键入
[[:space:]+
始终是手指练习)例如:
([^[:space:]]+[:space:]+{2})的
{n,m}
量词
值得一提的是,每当您替换字段时,awk都会重写该行,将空格替换为OFS
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