2016-07-27 61 views
1

我有一个文件“lines.txt”的内容替换该行的数字:匹配文档中只有一条线路,然后使用bash在Ubuntu

SomeLine=string 
PeopleCharms=007 
OtherLine=667 
PeopleCount=19 
MoreLines%=0 
AndYetMore%=34HG711 

使用在Ubuntu 14.04 bash脚本叫' change.sh'我想用另一个数字来替换Line“PeopleCount =”中的“19”,这是我作为变量的一个数字。

互联网:-)表明

sed -i '/^PeopleCount/ s/\d+/$var/g' lines.txt 

应该做的伎俩。但事实并非如此。我也尝试过Expresso,看看我可以上班,但这些工具当然不够聪明,无法预测我想要的东西......但是, (只是为了确保变量不是问题,我也使用静态数字来查看它是否有效)

它可以在一个正则表达式中完成吗?非常感谢您的帮助!

+0

你的想法:'sed的-i '/^PeopleCount =/S/[0-9] \ + /' “$ VAR” '/' file' – Cyrus

回答

3

很少有工具会将\d识别为代表数字(因此在必要时使用[0-9]),shell不会在单引号内扩展变量。试试这个:

sed -i 's/^\(PeopleCount=\).*/\1'"$var"'/' lines.txt 
+1

为什么不双引号全命令? 'sed -i“/^\(PeopleCount=\).*/\1$var/”lines.txt'。 – SLePort

+0

@Kenavoz因为它打开了整个命令,直到shell解释为止,所以你需要担心shell可能用它来做什么,例如,如果你的命令包含一个'$'符号,你必须转义它。无论使用什么工具,都不要将任何UNIX脚本放在双引号中,将所有脚本放在单引号中,只需将它们打开以便在必要的最小位置周围访问shell。 –

+1

加1但awk也很好:'gawk -F = -v“x = $ var”-i inplace'$ 1 ==“PeopleCount”{$ 2 = x} 1'OFS == lines.txt' – John1024