我需要替换文件中的一行并与之斗争。首先,我需要在文件中找到一个字符串,将此行号存储为变量,然后使用带有新字符串的变量替换整行。
我尝试了一些sed的变种,目前我的代码如下:
line=$(grep -n "latitude" /tmp/system.cfg |cut -f1 -d:);
sed "{$line}s/.*/system.latitude=1.888888/" /tmp/system.cfg ;
我已经运行了第一个命令并成功设置了line
。当回显$ line时,我得到176.但是,sed命令似乎没有替换该行,无论我是否使用该变量或手动将176放置如此
sed "176s/.*/system.latitude=1.888888/" /tmp/system.cfg ;
我也试过以下似乎将该行写入该文件,但它添加了该行,而不是覆盖现有行:
sed -i $line'i'"system.latitude=1.76011" /tmp/system.cfg;
line=$(grep -n "latitude" /tmp/system.cfg |cut -f1 -d:);
我也试过使用单引号和双引号无济于事。有人能指出我走向错误的方向。
答案 0 :(得分:3)
如果我理解你,你可以保存grep|cut
,你的要求可以一次性用(gnu)sed完成:
sed -i '/latitude/s/.*/system.latitude=1.888888/' /tmp/system.cfg
答案 1 :(得分:0)
当肯特完全提到将grep从方程式中删除时,肯定是完全正确的。对于任何感兴趣的人都是使用我的方法的最终代码:
line=$(grep -n "latitude" /tmp/system.cfg |cut -f1 -d:);
sed -i "${line}s/.*/system.latitude=1.999/" /tmp/system.cfg;
但是我会和Kent一起回答最终的实施问题。
正如汤姆指出的那样,这是你承诺一个过程并使问题进一步复杂化的问题之一:
这就是所谓的XY问题。你决定了一个过程(找到行,存储到一个变量等)并询问如何做到这一点,而不是简单地询问"如何替换匹配模式的整行?#34;。肯特做得好到底。 - 汤姆·费内奇