awk或sed用相邻的$ 2替换特定的$ 3

时间:2012-10-16 06:08:33

标签: sed awk

文件看起来像

$1    $2      $3

Text  Text2    *

Text  Text4    Text3

我想在文件中搜索*'s,并将其替换为旁边的列中的文本。在保留其余信息的同时......基本上将* logicaly替换为第2列。

目前我正在使用sed或awk

awk : awk '{ if($3=*) {print$2}}'有效...但我想保留1,2美元以及

sed : sed -r 's/[*]//g'我无法让reg表达式正确地替换为$ 2

任何快速帮助,提示或技巧?

3 个答案:

答案 0 :(得分:2)

awk解决方案:

awk '$3=="*"{$3=$2}1' file

答案 1 :(得分:2)

file.txt的内容:

Text Text2 *
Text Text4 Text3

使用awk的一种方式:

awk '$3 == "*" { $3=$2 }1' file.txt

结果:

Text Text2 Text2
Text Text4 Text3

答案 2 :(得分:2)

使用GNU sed \S\s可分别用于表示非空格和空格,因此您可以完成您想要的内容:

sed -r '/(\S+)\s+(\S+)\s+\*/ s//\1 \2 \2/'

s///命令隐式使用//中的匹配项。

如果它在 steve 列出的输入上运行:

sed -r '/(\S+)\s+(\S+)\s+\*/ s//\1 \2 \2/' file.txt

输出:

Text Text2 Text2
Text Text4 Text3

如果要保留列间空格,请使用:

sed -r '/(\S+)(\s+)(\S+)(\s+)\*/ s//\1\2\3\4\3/'