使用Sed / Awk / Grep基于行的开头替换行的中间部分

时间:2016-08-12 21:51:40

标签: bash awk sed grep

我对bash / unix编程很新。但是我有一个我无法弄清楚的问题。为了以最基本的方式,我的csv文件有一个类似于下面的表。

原件:

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

我正在尝试更换“你好”。字符串不同,基于第一列中的文本类型。

我已经创建了替换“Hello'如果找到了,但我无法弄清楚如何对第一列做出反应。

非常感谢您的帮助。

6 个答案:

答案 0 :(得分:1)

这个awk单行应该做你想做的事:

ansible
  • awk -F',' '{t=$1;sub(/TYPE/,"",t);gsub(/Hello/,"RESULT"t);print}' file 获取第一列中的数字,并保存在var sub()
  • t将所有gsub()更改为Hello + RESULT

答案 1 :(得分:0)

您可以使用sed

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

在上面的命令中,TYPE之后的数字在搜索文本中为()附近,而\2用于替换文本以在替换文本中的RESULT之后附加它。这通常称为反向引用。

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

答案 2 :(得分:0)

假设你真的不想剥离" TYPE"要留下1或2来结束RESULT,但实际上必须测试/设置特定的值:

$ 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

答案 3 :(得分:0)

您没有明确表达对第一列的反应。当规则对于@sps的解决方案而言过于复杂时,您可以尝试其他方法:

f True :: (c -> Bool) -> Bool

当你有很多翻译并且有时需要更改它们时,你想在配置文件中编写它们。 sed命令需要读取配置文件,并且可能会出现sed '/^TYPE1,/ s/Hello/Result1/g; /^TYPE2,/ s/Hello/OtherResult/g' yourcsvfile 等字符和正则表达式中具有特殊含义的字符的问题。 使用配置文件可能类似于

=/#,

答案 4 :(得分: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

答案 5 :(得分:0)

使用gensub和反向引用的另一个AWK(实际上是GAWK):

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

如果记录中有多个匹配项,则它与最后一个匹配第一个匹配项的匹配项匹配。