Bash 如果匹配,则替换行中的一个字
我得到了一份文件。如果一行的第三个字是“xxx”,那么我需要将其替换为“yyy”。我的最终输出必须包含所有原始行和修改后的行。 输入文件是- 所需的输出文件应为- 我试过了-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
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;ised
解决方案:
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
第三个字段等于stringxxx
,则在此处检查条件,然后将$3
的值设置为stringyyyy
。然后在此处提及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