繁体   English   中英

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

[英]Linux: Replace value for tab separated line in text file using 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}

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

您无需使用制表符两次,只需使用\\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,,,等。

您应该考虑使用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

这样可以避免使用特殊字符(例如)带来的麻烦. 匹配allting,并且/data/nightly...会在/用作分隔符时中断您的替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM