LinuxSir.cn,穿越时空的Linuxsir!

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

sed对控制字符的操作问题。

[复制链接]
发表于 2009-3-1 21:36:58 | 显示全部楼层 |阅读模式
os:ubuntu 8.10

root@yan-desktop:/test/test# cat -v dos.txt
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M


root@yan-desktop:/test/test# cat -v dos.txt | sed 's/^M//g'
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M

注:cat -v dos.txt | sed 's/^M//g'---这个命令里面的^M是我按ctrl+v后按回车输入的

为什么这里不能过滤掉^M呢?:wheel:
发表于 2009-3-1 22:26:41 | 显示全部楼层
印象中你似乎滥用cat,如果是的话可以考虑改掉。

自己想为什么:
  1. $ file dos.txt
  2. dos.txt: ASCII text, with CRLF line terminators
  3. $ cat -v dos.txt > not_dos_again.txt
  4. $ file not_dos_again.txt
  5. not_dos_again.txt: ASCII text
  6. $
复制代码
然后正确的one-liner验证sed起效的方法应当是:
  1. $ sed 's/^M//g' dos.txt | cat -v
复制代码
如果你硬是要使用你的方法也可以的:
  1. $ cat -v dos.txt | sed 's/\^M//g'
复制代码
其中“^M”就是一个'^'字符后跟一个'M'字符。不过要是你的原文里本来就有字符'^'后跟字符'M',那就完蛋啦... XD
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-2 21:46:10 | 显示全部楼层
Post by Jockey;1954777
印象中你似乎滥用cat,如果是的话可以考虑改掉。

自己想为什么:
  1. $ file dos.txt
  2. dos.txt: ASCII text, with CRLF line terminators
  3. $ cat -v dos.txt > not_dos_again.txt
  4. $ file not_dos_again.txt
  5. not_dos_again.txt: ASCII text
  6. $
复制代码
然后正确的one-liner验证sed起效的方法应当是:
  1. $ sed 's/^M//g' dos.txt | cat -v
复制代码
如果你硬是要使用你的方法也可以的:
  1. $ cat -v dos.txt | sed 's/\^M//g'
复制代码
其中“^M”就是一个'^'字符后跟一个'M'字符。不过要是你的原文里本来就有字符'^'后跟字符'M',那就完蛋啦... XD


root@yan-desktop:/test/test# cat dos.txt
12332##DISO##45.12
00332##LPSO##23.11
01299##USPD##24.46

root@yan-desktop:/test/test# cat -v dos.txt | sed 's/^M//g'
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M


root@yan-desktop:/test/test# cat -v dos.txt | sed 's/\^M//g'
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M


root@yan-desktop:/test/test# file dos.txt
dos.txt: ASCII text, with CRLF, LF line terminators
root@yan-desktop:/test/test# cat -v dos.txt > not_dos_again.txt
root@yan-desktop:/test/test# file not_dos_again.txt
not_dos_again.txt: ASCII text
root@yan-desktop:/test/test# cat not_dos_again.txt
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M


root@yan-desktop:/test/test# sed 's/^M//g' dos.txt | cat -v
12332##DISO##45.12
00332##LPSO##23.11
01299##USPD##24.46


root@yan-desktop:/test/test# cat -v dos.txt | sed 's/\^M//g'
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M

以上的^M为先ctrl+v后按回车后所得,包括命令行,以上为按照您的方法做的验证,最后一条命令执行完之后,^M仍然没有过滤替换掉,但是在上面的是可以,是不是cat -v之后的^M重定向后就不是^M了,而是asicc的^M了。继续验证如下:
root@yan-desktop:/test/test# cat -v dos.txt | sed 's/\^M//g' > dostosed.txt
root@yan-desktop:/test/test# cat dostosed.txt
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M


root@yan-desktop:/test/test# cat -v dostosed.txt
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##24.46^M
验证完成,请版主指点一下。
回复 支持 反对

使用道具 举报

发表于 2009-3-2 22:54:03 | 显示全部楼层
楼主,我对你的理解力,佩服!

你知道cat 里 -v 选项是干什么用的吗?
你就没看出“你看到的^M和你没看到的^M有什么区别?”
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-3 10:56:25 | 显示全部楼层
Post by tomgrean;1955332
楼主,我对你的理解力,佩服!

你知道cat 里 -v 选项是干什么用的吗?
你就没看出“你看到的^M和你没看到的^M有什么区别?”
啊,明白了,的确是cat -v的选项理解的不够深入,才导致不断的纠缠于^M这个控制字符,谢谢。
cat命令

功能1:在标准输出上显示文件。

语法:cat 〔 - 选项 〕 文件

说明:该命令功能之一是用来显示文件。它依次读取其后所指文件的内容并将其输出到标准输出。

cat命令中各个选项的含义为:

- v 用一种特殊形式显示控制字符,LFD与TAB除外。

加了- v选项后,- T和- E选项将起作用。其中:

- T 将TAB显示为“Ù I”。该选项需要与- v选项一起使用。即如果没有使用- v选项,则这个选项将被忽略。

- E 在每行的末尾显示一个$符。该选项需要与- v选项一起使用。

- u 输出不经过缓冲区。

- A 等于- vET。

- t 等于- vT。

- e 等于- vE。
例如 cat example.txt
功能2:连接两个或多个文件

说明:该命令功能之二是用来将两个或多个文件连接起来。
例如$ cat file1 file2 > file3
回复 支持 反对

使用道具 举报

发表于 2009-3-3 10:56:53 | 显示全部楼层
我喜欢问问题(^^b):楼主,请用echo输出一个“^M”。注意,你在屏幕上看到“^M”两个字符,而不是看到一个空白行。请问你此时你用echo输出的到底是字符串“^M”还是单个字符^M?
回复 支持 反对

使用道具 举报

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

本版积分规则

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