LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: sdjw

如何在文本中间插入一行?--[已解决]

[复制链接]
 楼主| 发表于 2004-3-12 16:25:24 | 显示全部楼层
不用c 环境。我只要一个shell 就可以了。
linux 环境你有吗?
用VI插入是可以的,但是我的本意并非如此。
谢谢
发表于 2004-3-12 17:26:15 | 显示全部楼层
:sorry,你看这样是否可以?
/home/javalee:cat in
/bbbb/a\
xxxxx
/home/javalee:sed -f in txt|tee new.txt
aaaaa
bbbbb
xxxxx
ccccc
/home/javalee:cat new.txt
aaaaa
bbbbb
xxxxx
ccccc
发表于 2004-3-12 18:00:29 | 显示全部楼层
最初由 sdjw 发表

第一 不能直接在原文件中增加记录。要产生一个新文件,然后删除原文件,
再把新文件拷贝成原文件名

系统每次都要先删除旧文件再建立一个同名的文件的,当你每保存一个已做修改的文件时,有的系统对该文件加了写锁也是这样操作。
发表于 2004-3-12 18:45:28 | 显示全部楼层
其实按模式匹配来更改一个文件内容,不可避免地要生成一个临时文件。(可能我还不会如何直接更改文件)起码用脚本来做应该如此。初学perl,就此写了个粗糙的perl脚本,练习练习罢了,见笑。

  1. #!/usr/bin/perl
  2. ($#ARGV <= 0) || print "Your must input filename to process!\n";
  3. open OBJFILE, "$ARGV[0]" or die "$!";
  4. open TMPFILE, ">_tmpfile";
  5. while (<OBJFILE>) {
  6.     s/^(bbbbb$)/$1\nXXXXX/g;
  7.     select TMPFILE;
  8.     print;
  9. }
  10. `mv -f _tmpfile $ARGV[0] && rm -f _tmpfile`;
复制代码

当然,最好还是用我心爱的emacs来处理这类事,这是emacs的强项之一。
发表于 2004-3-12 18:59:04 | 显示全部楼层
最初由 home_king 发表
其实按模式匹配来更改一个文件内容,不可避免地要生成一个临时文件。(可能我还不会如何直接更改文件)起码用脚本来做应该如此。初学perl,就此写了个粗糙的perl脚本,练习练习罢了,见笑。
  1. #!/usr/bin/perl
  2. ($#ARGV <= 0) || print "Your must input filename to process!\n";
  3. open OBJFILE, "$ARGV[0]" or die "$!";
  4. open TMPFILE, ">_tmpfile";
  5. while (<OBJFILE>) {
  6.     s/^(bbbbb$)/$1\nXXXXX/g;
  7.     select TMPFILE;
  8.     print;
  9. }
  10. `mv -f _tmpfile $ARGV[0] && rm -f _tmpfile`;
复制代码
当然,最好还是用我心爱的emacs来处理这类事,这是emacs的强项之一。

sed和awk都有生成文件的命令像sed的w
 楼主| 发表于 2004-3-12 19:24:01 | 显示全部楼层
我按照下面代码写了个a.sh

#!/usr/bin/perl
($#ARGV <= 0) || print "Your must input filename to process!\n";
open OBJFILE, "$ARGV[0]" or die "$!";
open TMPFILE, ">_tmpfile";
while (<OBJFILE> ) {
    s/^(bbbbb$)/$1\nXXXXX/g;
    select TMPFILE;
    print;
}
`mv -f _tmpfile $ARGV[0] && rm -f _tmpfile`;



最后运行 ./a.sh test.txt

没有任何反映,并没有插入XXXX。
有请兄弟们再帮忙。谢谢
发表于 2004-3-12 19:33:02 | 显示全部楼层
这是perl脚本!!!,
perl scriptname

我看这个足够用!
  1. sed '/gggggg/a\
  2. xxxxxxx' file >newfile;rm file
复制代码
汗ing~~~~
 楼主| 发表于 2004-3-12 19:58:45 | 显示全部楼层
谢谢高手们。呵呵,烦死你们了吧?
sed '/gggggg/a\
xxxxxxx' file >newfile;rm file
是可以解决问题。但是并不是我真正要的程序。
我要的程序是
写一个相当于插入函数一样的shell
比如  shell  test.txt 'aaaa' 'bbbb'
相当于在 test.txt 的aaaa 字符串下一行插入
bbbb 字符串
这里的 'aaa' 和'bbb' 都需要用可以变量来代替的
相当于写成一个函数。

再次感谢
发表于 2004-3-12 21:17:19 | 显示全部楼层
那就写成一个函数:
#!/bin/bash
count() {
sed 's/defaults/SOME/g' file_name >new.tmp ;rm file_name
}
count #这里直接引用。
cat new.tmp
 楼主| 发表于 2004-3-12 23:59:27 | 显示全部楼层
谢谢777,你的教本是替换,不是插入。
谢谢javalee 你的教本sed '/gggggg/a\
xxxxxxx' file >newfile
是可以的。问题是写成了2行我程序不好处理,能不能写成一行呢?
sed '/gggggg/a\xxxxxxx' file >newfile 。这样执行会错误。

有没有什么变通的办法,也就是写一个shell 。让我传参数经来。
类似:
shell test.txt 'aaaa' 'bbbb'
相当于在 test.txt 的aaaa 字符串下一行插入
bbbb 字符串
这里的 'aaa' 和'bbb' 都需要用可以变量来代替的
相当于写成一个函数。

关键就是这个shell 怎么写?

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表