[英]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.