一些文字替换问题。请指教

时间:2011-06-18 18:29:03

标签: linux bash scripting sed

我是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

我也尝试了替换方法,但我没有得到任何结果。

任何解决方案都会很好。感谢的

2 个答案:

答案 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。