LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1623|回复: 6

如何让awk能修改并保存输入文件?

[复制链接]
发表于 2006-9-11 20:04:44 | 显示全部楼层 |阅读模式
这几天看了一下awk语言,觉得比较强大,perl我没学过,所以我觉得awk是我目前所熟悉的
处理文本的最强大的语言了(我学过的脚本语言比较少 呵呵)
现在有一个问题,就是awk要修改文本的话,除非把输出重定向到一个新的文件中,否则没
有办法在原文件中修改。现在我想有这个把修改直接保存在原文件中的功能吗?谢谢了
发表于 2006-9-11 20:12:51 | 显示全部楼层
awk是个语言,不是个编辑器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-11 20:29:40 | 显示全部楼层
Post by seamonkey
awk是个语言,不是个编辑器。
我知道是语言,但是我想在一个已经存在的文件上每行行首显式加上行号,这个功能"编辑器"不是很容易就能完成的吧
回复 支持 反对

使用道具 举报

发表于 2006-9-11 20:37:30 | 显示全部楼层
但重定向以下也不麻烦。

http://linuxsir.cn/bbs/showthread.php?t=255516
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-11 20:53:44 | 显示全部楼层
Post by seamonkey
但重定向以下也不麻烦。

http://linuxsir.cn/bbs/showthread.php?t=255516
谢谢,不过这个贴子好像只能把真正的行号写进来,假如我不是写行号,而是写一个按一定规则变化的数字(字母)序列呢
其实我只是行号举个例子而已,为的是说明我要用到变量,循环等程序语言的特性.这些特性虽然有的编辑器可以提供(如vim),
但总是一种不通用的方法.
重定向一两个文件当然不算很麻烦,可以我要处理的文件很多,而且处理完之后bash还要再处理,
就是说文件名也是变量要传给bash.这样的话如果文件名保持不变就比较方便了
回复 支持 反对

使用道具 举报

发表于 2006-9-12 05:03:24 | 显示全部楼层
All uncached or no-tmp-file i/o's to a file are destructive. such as cat <file >file. Why some other editors can edit file on-fly is because either they cache the updates in memory or write to a tmp file. Such as vi, sed -i, crontab -e, etc...
回复 支持 反对

使用道具 举报

发表于 2006-9-12 08:01:04 | 显示全部楼层
Post by lsk03

重定向一两个文件当然不算很麻烦,可以我要处理的文件很多,而且处理完之后bash还要再处理,
就是说文件名也是变量要传给bash.这样的话如果文件名保持不变就比较方便了


重定向到一个新文件之后再加条语句改回原来的名字不就得了

for file in .....
do
  awk ... $file > $file.tmp
  mv $file.tmp $file
  ....
  ...
done

或者在awk的BEGIN区域把文件全部读进去,然后处理后用print写到原文件名
input=$1
echo "" | awk 'BEGIN{
   while ((getline < "'$input'") > 0) {
           i++ ;
           line=$0 ;
   }
   linenumber=i ;
   system("rm -f '$input'")
}
{
   for (i=1;i<=linenumber;i++) print i,line >> "'$input'"
}'
回复 支持 反对

使用道具 举报

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

本版积分规则

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