Linux:使用sed替换文本文件中制表符分隔行的值

时间:2016-06-15 19:36:43

标签: linux bash sed

Linux:如何使用sed替换文本文件中制表符分隔行的值。

myfile中的示例数据:

98104930    CLOSED  /data/nightlybackup/adx.ngx kyangx@nginx.com

预期:

98104930    FIXED   /data/nightlybackup/adx.ngx kyangx@nginx.com

id=98104930
qa=kyangx@nginx.com
testcase=/data/nightlybackup/adx.ngx
oldstatus=CLOSED
newstatus=FIXED

我试过了:

sed -i "s/${id}\\t${oldstatus}\\t${testcase}\\t${qa}/${id}\\t${newstatus}\\t${testcase}\\t${qa}/g" ${myfile}

但这不起作用。有人可以提供相同的解决方案吗?

2 个答案:

答案 0 :(得分:2)

您不需要双重转义标签,只需使用\t即可。 而且你必须在sed中使用不同的分隔符,因为你的一个变量使用了/testcase),所以sed被它所欺骗,例如你可以使用#

sed -i "s#${id}\t${oldstatus}\t${testcase}\t${qa}#${id}\t${newstatus}\t${testcase}\t${qa}#g" ${myfile}

在sed中,您几乎可以使用任何字符作为分隔符,s///s###s,,,等。

答案 1 :(得分:1)

您应该考虑使用awk:

$ awk -v id='98104930' \
      -v newstatus='FIXED' \
      -v testcase='/data/nightlybackup/adx.ngx' \
      -v qa='kyangx@nginx.com' \
      -v OFS='\t' \
     '$1 == id && $3 == testcase && $4 == qa {$2=newstatus} 1' file
98104930    FIXED   /data/nightlybackup/adx.ngx kyangx@nginx.com

这样可以避免使用特殊字符时出现问题,例如.匹配每个字符,/data/nightly...会在/用作分隔符时中断替换。