[实践OK]linux 去除 windows 换行符:Linux编辑器vim中删除行尾的^M,Windows和Unix的换行符处理^M。

jackxiang 2009-10-10 14:05 | |
背景: 外包的代码里有很多windows换行符号,只想查找不想替换,于是对这个^M符号产生了新的看法。
没有:
cat content.php |grep -rin "\r\n"
有:
cat index.php |grep \r\n
$setData['username'] = $data->username;
但这都是不对的:
回忆未来-向东-Jàck  下午 05:40:02
怎么查找文件里有windows换行啊?兄弟。我硬是拦住了。
我想grep一整个目录,查到有windows换行的文件。
老罗新  下午 05:57:46
window换行是ctrl+V+M
grep -R */* "^M"
老罗新  下午 05:59:08
或者
find .  -type f|xargs grep "^M"
回忆未来-向东-Jàck  下午 05:59:36
我用了\r\n,我试试哈:
[root@localhost site]# find .  -type f|xargs grep "^M"
[root@localhost site]#
里面有一个文件有window换行,没找到呀,哈。

老罗 下午 06:11:54
俺这里是没有问题的。
find ./ -name a.c -type f |xargs grep "^M"
是不是那个"^M",你输入的不对?
—————————这玩意输入不能粘贴:注意:一跟三两种方法中的^M都是ctrl+v再ctrl+m后产生的———————
老罗新  上午 10:22:34
你输入的^M是使用ctrl+v+m敲出来的吧。
回忆未来-向东-Jàck  上午 10:23:10
不是。
我直接贴的你的。
老罗新  上午 10:23:42
怪不得。要先按着ctrl不松,然后依次按v和m
回忆未来-向东-Jàck  上午 10:24:18
哈哈,就是这个问题,好了。
那在vim里查找哩?
也这样可以吧,哈哈。
老罗新  上午 10:24:44
也一样
回忆未来-向东-Jàck  上午 10:25:56
复制粘贴都不行,非得这样整出来。
————
以前都是dos2unix,是想给外包找到这些文件,
这玩意太高深了,吼吼,多谢多谢,这方法好。
老罗新  上午 10:26:22
不客气

按Ctrl+v+m即可,复制粘贴有可能会提示找不到^M:
http://www.dbdream.org/?p=454

实践OD:
http://www.boyunjian.com/do/article/snapshot.do?uid=net.csdn.blog/wzb56/article/details/6860358
先生成一个换行(\n, 0x0A)和回车(\r, 0x0D)组合的文本
$ echo -en '12\n34\r56\n\r78\r\n' > tmp
以十六进制方式查看文本
$ od -t x1 tmp
0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a
实践:
[root@test od]# echo -en '12\n34\r56\n\r78\r\n' > tmp  
[root@test od]# ls
tmp
[root@test od]# od -t x1 tmp
0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a
0000016
————————————————————————————————
Linux编辑器vim中删除行尾的^M

有时候,在 Linux 中使用打开曾在 Windows 中编辑过的文件时,会在行尾看到 ^M 字符。看起来总是感觉很别扭。
删除方法如下:
在 Vim 的命令模式中输入 :%s/^M$//g 后,回车即会自动删除该文件中的所有 ^M 字符。
注意: ^M 要用 Ctrl + v,  Ctrl + m 来输入,M 后面的 $ 代表匹配行尾的内容,最后的 g 则表示每行中匹配到的内容都要置换。


OJ判题时发现一个问题:用%c读入的代码都会报wa。后来发现跟scanf有关。在linux下使用%c会读到\n和\r两个字符。所以需要将^M(也就是\r)字符删掉
删除方法不少。找了一个比较简单的。
要将a.txt里的^M去掉并写入b.txt,则使用如下指令cat a.txt | tr -d "^M" > b.txt
注意:语句中的^M是通过ctrl+V, ctrl+M输入的。特指/r字符
来自:http://hi.baidu.com/xyhouse/item/1598874e9bc2f80f6dc2f09c

linux 去除 windows 换行符:
解决方法:

1.通过sed命令解决

就是这个破命令废了我好大劲
1
  
sed -i -e "s/\cM//g"  filename

之前走了弯路虽然实现了但是总是觉得不爽才发现可以这么使用。之前写的命令是”s/[^A-Za-z0-9\"\)\_]$//g”其实这样也是可以的,原理很简单因为一般的匹配开始无法找到^M但是我发现通过正则匹配是可以匹配到的。因此上面那个公式的意思就是查找行尾除了字母数字符号以外的符号,其实就剩下控制符啦。很山寨哦
2.通过vim转换文件格式解决

这个方法虽然早就知道但是不适合我这次的需求但是写出来备档

:set fileformat?查看当前文档格式会显示为fileformat=[unix|dos|mac]其中过一种
把一个dos格式的文件转换成unix格式可以通过以下两步完成:
:set fileformat=unix
:write

3.通过tr命令解决

tr -d “[\015]” < file >/tmp/file

tr是个很好处理控制符号的程序但是没弄明白怎么修改当前文件,因此多数只能用作转换,file为源文件。/tmp/file为转换后的文件

其实很简单的问题解决起来也未必简单,希望这里的备档能给大家帮助
来自:http://www.wo1768.com/?p=1073


Windows和Unix的换行符处理^M


在windows上写好的文件,在Linux或者Unix下打开,每一行都会出多出^M这样的字符,这是因为Windows与*nix的换行符不同所致,如果是一般的文件影响倒是不大,但如果是写的脚本文件,那有可能就执行不了。对于行数比较少相对简单的文件来说,直接删掉然后保存就可以了。

1、但是如果这个文件要是有几百上千行,一行一行删除是要累死人的,有没有好的办法呢?
答案是:在Vi的命令模式中输入:%s/^M$//g后,回车即会自动删除该文件中的所有^M字符。
%指匹配整个文件,s是置换的意思,^M要分另用(Ctrl+V)和(Ctrl+M)来输入,M后面的$代表匹配行尾的内容,最后的g则表示每行中匹配到的内容都要置换。

2、如果我某一目录下有很多这样的文件怎么办?总不能每个文件都用Vi修改一次吧?
答案是:用unix2dos来解决。在Freebsd系统ports安装unix2dos很简单:
root# whereis unix2dosroot# cd /usr/ports/converters/unix2dos root# make install clean

安装完之后,就可以运行这个命令进行转换了:
root# dos2unix /root/tmp/*

3、如果我有很多目录及子目录都有这样的文件怎么办呢?别急,我们用find的递归命令处理:
root# find /root/tmp –type f –exec dos2unix {} \;

此命令之后,tmp目录下所有文件及子目录下的文件全部都被转换了。简单吧!

备注:unix2dos还有另外一个作用就是把unix格式的文件转化成Windows格式的文件,就是命令反过来:unix2dos ,比如我想看一下Apache的日志,就需用这个命令转换一下。

来自:http://hi.baidu.com/izhaohan/item/042709bd6b6136d084dd79d9

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/2040/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2013-12-25 10:42
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]