日期:2014-05-16  浏览次数:20692 次

linux——新手提问(关于文件内容替换)
问题:
就是有一个Test.c文件,这个文件里的内容:
# include<stdio.h>
void main(){
   prinitf("hello linux");
}

因为由于printf拼错了嘛,所以想用一个文件里的内容去(不用vim或vi)修改他,就用printf替换掉prinitf!

大家知道怎么做嘛?

如果会做,麻烦多花点时间,解释写详细点,号码?

先谢谢了大家了!

------解决方案--------------------
对于编辑文本格式的文件:
1.  vi 基本上linux都自带,甚至vim. 不知为何不使用vi (的确是个高效的编辑器) 
     简单指令 (vi 中)  
:1,10s/print/printf/g 
 
    在第1行到第10行,查找(Search) print(或其他正则表达式)并且全部(g)替换成printf 。
    "/"符号是域分隔符。冒号":"是vim命令的起始符
    具体 man vim ,谷歌 vim 查找 替换


2. sed (Stream edit 流编辑器 )处理文本的利器.linux基本有.
    简单指令(bash中) 
sed  '1,10s/print/printf/g' 文件名

    在第1行到第10行,查找print并且全部替换成printf .
    sed会将文本输出至标准输出设备(一般是屏幕),所以 你可能需要使用输出重定向符(>)将其保存到另一个文件:
     
sed  '1,10s/print/printf/g' 文件名 > 另一个文件

    具体 man sed ,谷歌 sed 查找替换

3. 其他文本编辑器 如Emacs,nano,ed等用的不多。不太清楚。相见百科 https://zh.wikipedia.org/wiki/%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8%E6%AF%94%E8%BE%83

另: 如果楼主想用自己的方式修改其中的内容。最简单的就是c语言写一段小程序,主要涉及文件读写操作。
        fread,fwrite等系统调用会用得着。注意小心别覆盖错了原文件。
        然后编写字符串匹配功能,查找字符串。将修改的字符在依次写到新文件中。
        具体参考man手册 man 3 fread 和 man 3 fwrite

基本上就是这样了 :)
------解决方案--------------------
引用:
引用:对于编辑文本格式的文件:
1.  vi 基本上linux都自带,甚至vim. 不知为何不使用vi (的确是个高效的编辑器) 
     简单指令 (vi 中)  Plain Text code1:1,10s/print/printf/g  
    在第1行到第10行,查找(Search) print(或其他正则表达式)并……


sed 就是一个命令(程序),处理文本文件很好用,配合正则表达是就更强大了。
sed运行在shell下。

末行模式,这个名词大概就是vim中才有的词汇吧。
------解决方案--------------------
引用:
引用:我没太明白楼主想要怎样做。
比如这个文件中存储的是什么?
   是一个shell脚本?通过运行该文件就可以改变源文件的内容?
   又或是这个文件中存储了正确的内容,通过外部某个程序读取该文件的内容去更改源文件的内容?
   又或是其他的一些方式。
此外,我不太明白为什么要用一个文件的方式。通过shell命令也……


那我是否可以这样理解。change.txt文件中存储的内容为printf,通过外部使用若干条命令将test.c文件中错误的prinitf字符串更改为change.txt中的内容。
如果如此,可以通过3条命令来完成:
CHANGE=$(cat change.txt)
首先声明一个变量CHANGE,将它赋值为cat change.txt命令的值,此时,CHANGE变量中存储的即为printf。
sed "s/prinitf/$CHANGE/g" test.c > tmp_test.c
接着使用sed命令匹配test.c文件中的prinitf,并将其更改为CHANGE的值。至此,错误的prinitf就被更改为printf了(关于sed命令的使用方法,请参阅《Linux与unix shell编程指南》第10章,其中有详细的使用示例)。但由于sed命令修改的是原文件在内存中的一份拷贝,所以需要将修改结果保存起来,将其重定向到中间文件tmp_test.c。
mv tmp_test.c test.c
最后将中间文件覆盖原文件。

可以将这3条命令组合在一起让shell依次执行,每个命令间用;隔开。
CHANGE=$(cat change.txt);sed "s/prinitf/$CHANGE/g" test.c > tmp_test.c;mv tmp_test.c test.c

Linux上编译源代码安装程序