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}
但这不起作用。有人可以提供相同的解决方案吗?
答案 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...
会在/
用作分隔符时中断替换。