我是bash脚本的新手,我遇到了问题。我想用另一行替换文件中的一行。这是我的档案:
/home/iosub/linux/fis2 b7c839bf081421804e15c51d65a6f8fc -
/home/iosub/linux/e212CIosub/doi 7edd241b1f05a9ea346c085b8c9e95c5 -
/home/iosub/linux/e212CIosub/test2 7edd241b1f05a9ea346c085b8c9e95c5 -
/home/iosub/linux/e212CIosub/xab ed4940ef42ec8f72fa8bdcf506a13f3d -
/home/iosub/linux/e212CIosub/test1 8af599cfb361efb9cd4c2ad7b4c4e53a -
/home/iosub/linux/e212CIosub/xaa 8cf57351b5fc952ec566ff865c6ed6bd -
/home/iosub/linux/e212CIosub/test3 74420c2c4b90871894aa51be38d33f2c -
没有空行。我想用另一行替换一行。
for example /home/iosub/linux/e212CIosub/test1 8af599cfb361efb9cd4c2ad7b4c4e53a -
with /home/iosub/linux/e212CIosub/test1 d2199e312ecd00ff5f9c12b7d54c97f1 -
我在变量中有/home/iosub/linux/e212CIosub/test1
,在另一个变量中有新代码。
我知道我必须使用sed。我该怎么办?
我尝试了很多组合,如:
sed "/$1/d" cont > cont2;
其中$1
为/home/iosub/linux/e212CIosub/test1
然后我将新字符串连接到文件。这会将新行放在文件的末尾,如果可行的话,这将是一个很好的解决方案。 。 。但它没有。它给出了一个错误:sed: -e expression #1, char 5: extra characters after command
我也尝试了替换方法,但我没有得到任何结果。
任何解决方案都会很好。感谢的
答案 0 :(得分:4)
编辑在@ chars前面添加'\'作为初始正则表达式分隔符
如果搜索模式中有'/'字符,则会将该字符('/')用作reg-exp分隔符。使用正则表达式中没有的正则表达式分隔符,即
sed "\@$1@d" cont > cont2
然后继续处理。
但是考虑到你的例子,你为什么不做像
这样的事情sed "s\@\($1\)(.*$)@\1 $2 -@" cont > cont2
这与$ 1的值相匹配,实际上是删除$ 1值后的文本,并打印$ 1值后跟空格,$ 2值(d2 ....),空格和结尾' - '字符。
编辑(最后),我会提到一些遗留的Unix sed(特别是aix)似乎不接受转义正则表达式分隔符char(但我无法访问系统到现在验证)。在这种情况下,你必须逃避正则表达式搜索模式中的所有'/',如\/home\/iosub\/linux\/e212CIosub\/test1
,yikes!
我希望这会有所帮助。
答案 1 :(得分:4)
sed "s@$1@$var@g" -i filename
这将用文件 filename 中的$ var替换所有出现的$ 1。