Chinaunix

标题: 求SHELL写法,如何从文件输入后,转换字符后再保存成原文件 [打印本页]

作者: dbsuit    时间: 2007-06-25 18:16
标题: 求SHELL写法,如何从文件输入后,转换字符后再保存成原文件
需求:
把文件的回车符去掉

我这样做的:
tr -d '\r' <file1 >file2
mv file2 file1
一切OK

但现在禁止生成临时文件,需要实现 tr -d '\r' <file1 >file1  可惜,这样输出后,file1为NULL

我试过下面写法:
cat file1 | tr -d '\r' > file1
也不行

求助!
作者: phoenixson    时间: 2007-06-25 20:50
很想了解答案是什么,如果不介意的话perl肯定行,但是不生成中间文件,有难度
作者: wysilly    时间: 2007-06-25 20:56
sed -i -e 's/\r//' file1
作者: phoenixson    时间: 2007-06-25 22:17
这样貌似不行啊,兄弟,楼主要求保存为源文件啊
作者: MMMIX    时间: 2007-06-25 22:36
原帖由 dbsuit 于 2007-6-25 18:16 发表于 1楼  
需求:
把文件的回车符去掉

我这样做的:
tr -d '\r' <file1 >file2
mv file2 file1
一切OK

但现在禁止生成临时文件,需要实现 tr -d '\r' <file1 >file1  可惜,这样输出后,file1为NUL ...

为什么不允许生成临时文件?
作者: maluyao    时间: 2007-06-25 22:53
用vim自带的功能最好吧。

例如有个1.txt文件中有换行符号。

  1. echo -e ':%s/\\n//g\n:wq' |vim -n 1.txt  2>/dev/null
复制代码


也问个问题,emac如何处理?

[ 本帖最后由 maluyao 于 2007-6-25 23:05 编辑 ]
作者: phoenixson    时间: 2007-06-25 23:00
原帖由 maluyao 于 2007-6-25 22:53 发表于 6楼  
用vim自带的功能最好吧。

例如有个1.txt文件中有换行符号。

echo -e ':%s/\\n//g'    "\n"    ':wq' |vim 1.txt  2>/dev/null


也问个问题,emac如何处理?


其实用vim也是一样要生成tmp文件的,这个文件存在于缓冲区内,如果你再另外在一个terminal中打开这个文件(或者不正常推出编辑),它会提示你已经存在**tmp
作者: maluyao    时间: 2007-06-25 23:03
加个-n参数就不用了。

原帖由 phoenixson 于 2007-6-25 23:00 发表于 7楼  


其实用vim也是一样要生成tmp文件的,这个文件存在于缓冲区内,如果你再另外在一个terminal中打开这个文件(或者不正常推出编辑),它会提示你已经存在**tmp

作者: dbsuit    时间: 2007-06-26 11:13
我刚试了一下,echo -e ':%s/\\n//g\n:wq' |vim -n t1  2>/dev/null,可以是可以,但有个很大的问题,性能太差,执行一个几行的文本文件,要好几秒,估计和VIM的处理机制有关,如果是大批量的文件,根本没法用。

不让使用临时文件是编码的要求,要求尽量不产生临时文件,我现在为了完成任务,不得以用了临时文件,但还是想找到更好的要求

我发现这个问题可能和管道的机制有关,我测试了一下,似乎无论使用“|",还是"<",">"这些,只要管道输出的文件和管道输入的文件是同一个文件,最后文件内容一律为NULL。我对这块不太熟,是不是有什么参数,或者缓存什么能解决,还需要大家的智慧

下面是简化模型,能解决了这个,就能回答上面的。
cat file1 | cat > file1,file1内容为空。cat file1 | cat >file2,一切正常。
作者: MMMIX    时间: 2007-06-26 11:33
原帖由 dbsuit 于 2007-6-26 11:13 发表于 9楼  
我刚试了一下,echo -e ':%s/\\n//g\n:wq' |vim -n t1  2>/dev/null,可以是可以,但有个很大的问题,性能太差,执行一个几行的文本文件,要好几秒,估计和VIM的处理机制有关,如果是大批量的文件,根本没法用。

Vim 会生成临时文件。
不让使用临时文件是编码的要求,要求尽量不产生临时文件,我现在为了完成任务,不得以用了临时文件,但还是想找到更好的要求

用 Shell 的话很难避免。
我发现这个问题可能和管道的机制有关,我测试了一下,似乎无论使用“|",还是"<",">"这些,只要管道输出的文件和管道输入的文件是同一个文件,最后文件内容一律为NULL。我对这块不太熟,是不是有什么参数,或者缓存什么能解决,还需要大家的智慧

和管道没什么关系,是 Shell 的重定向在做怪。对于 > 这种类型的重定向,Shell 在打开文件时会使用 O_TRUNC 标志(或其他功能类似的标记)。

[ 本帖最后由 MMMIX 于 2007-6-26 11:34 编辑 ]
作者: suisuiyouyu    时间: 2007-06-26 12:42
dos2unix file1 file
作者: haplo    时间: 2007-06-26 13:16
三楼的答案不是挺好的吗?前提是sed要支持-i参数。

另外,可能还有这种很糟糕的方法,也许能用:

  1. #!/bin/sh

  2. IFS='\n'
  3. tmp=`cat file1`
  4. echo $tmp | tr -d '\r' >file1
复制代码

作者: chenl    时间: 2007-06-26 13:24
可以考虑使用ed。
作者: 封神    时间: 2007-06-26 16:17
呜呜,看不懂啊,我对shell的正则表达式什么的一向感到很头痛
作者: lilianglinux    时间: 2007-06-28 10:30
原帖由 wysilly 于 2007-6-25 20:56 发表于 3楼  
sed -i -e 's/\r//' file1


为什么这个方法没有人评论呢?
我感觉不是能很好完成楼主的任务吗?  还是我太菜.....
作者: MMMIX    时间: 2007-06-28 10:52
原帖由 lilianglinux 于 2007-6-28 10:30 发表于 15楼  


为什么这个方法没有人评论呢?
我感觉不是能很好完成楼主的任务吗?  还是我太菜.....


作者: zongyaotang    时间: 2007-06-28 14:53
用dos2unix就是专门用来做此事的.
无论用什么办法,都得进行缓冲,只是你看得见和看不见的问题.
如果不允许在当前目录中有临时文件,可以放到/tmp中.
不允许有临时文件的要求不知是那位高人提出来的?
作者: dbsuit    时间: 2007-06-28 15:11
我刚测试过了,在linux下,dos2unix,sed -i -e 's/\r//' file1 都可以很好的满足要求。但是LINUX和WINDOW间本身就不会有问题,windows文件用FTP方式上传到Linux server,无论binary还是ascii,都会自动的去掉回车符

我在unix上测试,(HP-UX),
发现 1 无dos2unix指令,至少HP-UX没有,别的UNIX有没有不清楚
2 sed -i -e 's/\r//' file1 也达不到目的,没有-i参数,sed指令一共只有-f,e,n3个参数,经反复测试均不能达到要求

不得已,还是用临时文件最后mv改名交差了事
作者: MMMIX    时间: 2007-06-28 18:04
原帖由 dbsuit 于 2007-6-28 15:11 发表于 18楼  
我刚测试过了,在linux下,dos2unix,sed -i -e 's/\r//' file1 都可以很好的满足要求。但是LINUX和WINDOW间本身就不会有问题,windows文件用FTP方式上传到Linux server,无论binary还是ascii,都会自动的去掉回车符

是转换不同的换行方式,而不是去掉回车符(嘛是回车符?)
我在unix上测试,(HP-UX),
发现 1 无dos2unix指令,至少HP-UX没有,别的UNIX有没有不清楚

一般的 Unix 是没有这个,不过你可以自己编译一个,或者自己实现个简单的。
2 sed -i -e 's/\r//' file1 也达不到目的,没有-i参数,sed指令一共只有-f,e,n3个参数,经反复测试均不能达到要求

呵呵,Linux 默认的 sed 是有 -i 选项的。不过,写脚本也是要考虑可移植性的。
不得已,还是用临时文件最后mv改名交差了事

通常的做法。临时文件在 Unix 类系统中是很普遍的。
作者: forlorngenius    时间: 2007-06-29 10:45
LZ  , 你可以用
echo $(tr -d ''\r < file1) > file1
作者: forlorngenius    时间: 2007-06-29 10:46
echo $(tr -d '\r' < file1) > file1




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2