2016-08-12 51 views
0

我对bash/unix编程颇为陌生。不过,我有一个问题,我无法弄清楚。以最基本的方式来说,我的csv文件有一个类似于下面的表格。用Sed/Awk/Grep替换基于行首的中间行

原文:

TYPE1, text, text, text, Hello, text, text 
TYPE2, text, text, Hello, text, text, text 

输出:

TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 

我试图以不同的方式取代“你好”的字符串,基于哪种类型的文本是在第一列。

我已经创建了替换'你好'的代码,如果它被发现,但我无法弄清楚如何对第一列作出反应。

非常感谢您的任何帮助。

回答

0

您可以使用sed

sed -r 's/(^[ \t]*TYPE)([0-9])(,.*)Hello/\1\2\3RESULT\2/' filename 

在上述命令,TYPE后的数目由()在搜索文本sorround,和\2用于在替换文本中替换文本RESULT之后将其追加。这通常称为反向参考。

你可以谷歌关于“sed搜索和替换”,以及如何在sed中使用反向引用。最重要的是搜索和学习“正则表达式”。

1

这AWK的一行应该做你想要什么:

awk -F',' '{t=$1;sub(/TYPE/,"",t);gsub(/Hello/,"RESULT"t);print}' file 
  • sub()获取第一列中的数字,并在VAR节省t
  • gsub()改变所有HelloRESULT + t
0

假设你不是真的只想剥去“TYPE”到与1或2个左钉在结果的末尾,但实际上要测试/设定具体数值,

$ awk 'BEGIN{FS=OFS=", "} {sub(/Hello/,($1=="TYPE1" ? "RESULT1" : "RESULT2"))} 1' file 
TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 
0

要如何在第一列的反应你没有明确。当规则是@sps的解决方案太复杂,你可以尝试其他的东西:

sed '/^TYPE1,/ s/Hello/Result1/g; 
    /^TYPE2,/ s/Hello/OtherResult/g' yourcsvfile 

当你有很多的翻译​​,需要有时会改变他们,你想将它们写在配置文件中。 sed命令需要读取配置文件,并且可能会给像=/#,这样的字符和正则表达式中具有特殊含义的字符带来问题。 使用配置文件可能的工作就像

# Make configfile 
echo "TYPE1=Result1 
TYPE2=OtherResult2" > translatecsv.cfg 

# test the new cfg file, will it give valid sed commands? 
sed 's#\(.*\)=\(.*\)#/^\1/ s/Hello/\2/g;#;' translatecsv.cfg 

# All together now 
sed "$(sed 's#\(.*\)=\(.*\)#/^\1/ s/Hello/\2/g;#;' translatecsv.cfg)" yourcsvfile 
0

另一awk将与任何单个位数

$ awk 'match($1,/^TYPE/){sub("Hello", "RESULT"substr($1,RLENGTH+1,1))}1' file 

TYPE1, text, text, text, RESULT1, text, text 
TYPE2, text, text, RESULT2, text, text, text 
0

另一个AWK工作(以及GAWK实际上)使用gensub和逆向引用:

awk '{print gensub(/^(TYPE)([^,]+)((.*)(Hello))*/,"\\1\\2\\4RESULT\\2","g",$0)}' file 

如果记录中有多个匹配项,则匹配最后一个匹配其中某些其他答案的最后一个匹配项 第一。