dos格式文件传输到unix系统

 
问:dos格式文件传输到unix系统时,会在每行的结尾多一个^M,想知道具体的语句格式来讲怎样将dos格式文件转成unix格式,
答: 命令: %s^M//g 你这么敲肯定是不行的(卖一下关子,呵呵) 中间有两个字符是"^M",对吧. 按住Ctrl键,再按小v,再按小m就OK了,然后接着放开Ctrl键,再按"//g"
 
 
 
原理:
dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。
DOS下的文本文件是以/r/n作为断行标志的,表示成十六进制就是0D 0A。
而Unix下的文本文件是以/n作为断行标志的,表示成十六进制就是 0A。
DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M,
而且很多命令都无法很好的处理这种格式的文件,如果是个shell脚本,。
而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,
对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令

常用参数

将DOS格式文本文件转换成Unix格式,最简单的用法就是dos2unix直接跟上文件名。

格式:dos2unix file

如果一次转换多个文件,把这些文件名直接跟在dos2unix之后。(注:也可以加上-o参数,也可以不加,效果一样)

格式:dos2unix file1 file2 file3

格式:dos2unix -o file1 file2 file3

上面在转换时,都会直接在原来的文件上修改,如果想把转换的结果保存在别的文件,而源文件不变,则可以使用-n参数。

格式:dos2unix oldfile newfile

如果要保持文件时间戳不变,加上-k参数。所以上面几条命令都是可以加上-k参数来保持文件时间戳的。

格式:dos2unix -k file

格式:dos2unix -k file1 file2 file3

格式:dos2unix -k -o file1 file2 file3

格式:dos2unix -k -n oldfile newfile

注:unix2dos命令的使用方式与dos2unix命令的类似。

使用示例

示例一 DOS格式文本文件在Linux下的表现

现在有一个脚本文件job.sh,是在Linux下用vi编辑的。

[root@jfht ~]# cat job.sh 
#!/bin/sh

date >job.txt

 

现在把它转换成DOS格式文本文件。 
[root@jfht ~]# unix2dos job.sh 
unix2dos: converting file job.sh to DOS format ...

尝试着运行一下。 
[root@jfht ~]# ./job.sh 
-bash: ./job.sh: 权限不够
[root@jfht ~]# chmod +x job.sh 
[root@jfht ~]# ./job.sh 
-bash: ./job.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录

DOS格式的脚本文件时无法解释执行的,因为脚本文件的第一行是用来指定解释器的,Linux系统认为解释器是/bin/sh^M,而不是/bin/sh。

我们来通过Linux下的一些命令来看一下DOS格式文件的真面目。 
[root@jfht ~]# cat -v job.sh     <== cat -v可以看到文件中的非打印字符,而不带-v参数的cat命令不行。 
#!/bin/sh^M
^M
date >job.txt^M
^M
[root@jfht ~]# hexdump -C job.sh       <== hexdump -C可以看到文件每个字节的十六进制表示。 
00000000  23 21 2f 62 69 6e 2f 73  68 0d 0a 0d 0a 64 61 74  |#!/bin/sh....dat|
00000010  65 20 3e 6a 6f 62 2e 74  78 74 0d 0a 0d 0a         |e >job.txt....|
0000001e
[root@jfht ~]# vi job.sh     <== 使用vi打开时可以看到底下有[dos]的格式提示。有些版本vi显示的是行尾为^M。 

#!/bin/sh

date >job.txt

~                                                                                                                                   
~              

"job.sh" [dos ] 4L, 30C

现在我们把DOS格式改回Unix格式的,看看效果。

root@jfht ~]# dos2unix job.sh 
dos2unix: converting file job.sh to UNIX format ...
[root@jfht ~]# ./job.sh

可以执行了,不再报“-bash: ./job.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录”这个错了。 
[root@jfht ~]#

示例二 dos2unix -k和dos2unix -n的使用示例

[root@jfht ~]# cat <<EOF >1.txt 
> 1
> 2

> 3
> EOF
[root@jfht ~]# file 1.txt 
1.txt: ASCII text
[root@jfht ~]# ls -l 1.txt 
-rw-r--r-- 1 root root 6 11-14 09:08 1.txt
[root@jfht ~]# date 
2010年 11月 14日 星期日 09:28:42 CST
[root@jfht ~]# unix2dos -k 1.txt      <== 保持文件时间戳 
unix2dos: converting file 1.txt to DOS format ...
[root@jfht ~]# ls -l 1.txt 
-rw-r--r-- 1 root root 9 11-14 09:08 1.txt
[root@jfht ~]# dos2unix -n 1.txt 2.txt     <== 将1.txt转换到2.txt 
dos2unix: converting file 1.txt to file 2.txt in UNIX format ...
[root@jfht ~]# ls -l 1.txt 2.txt 
-rw-r--r-- 1 root root 9 11-14 09:08 1.txt
-rw-r--r-- 1 root root 6 11-14 09:30 2.txt
[root@jfht ~]# file 1.txt 2.txt 
1.txt: ASCII text, with CRLF line terminators
2.txt: ASCII text
[root@jfht ~]# cat -v 1.txt 
1^M
2^M
3^M
[root@jfht ~]# cat -v 2.txt 
1
2
3
[root@jfht ~]#

 

 

DOS格式文本转成Unix格式文本:1,$s/^M//g

^M  输入方式 ctrl+v+m 

 文本转换和替代: --------

# Unix环境:转换DOS的新行符(CR/LF)为Unix格式。 sed 's/.$//' # 假设所有行以CR/LF结束 sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V sed 's/x0D$//' # ssed、gsed 3.02.80,及更高版本

# Unix环境:转换Unix的新行符(LF)为DOS格式。 sed "s/$/`echo -e r`/" # 在ksh下所使用的命令 sed 's/$'"/`echo r`/" # 在bash下所使用的命令 sed "s/$/`echo r`/" # 在zsh下所使用的命令 sed 's/$/r/' # gsed 3.02.80 及更高版本

# DOS环境:转换Unix新行符(LF)为DOS格式。 sed "s/$//" # 方法 1 sed -n p # 方法 2

# DOS环境:转换DOS新行符(CR/LF)为Unix格式。 # 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的 # sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看 # 其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS # 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。 sed "s/r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本 tr -d r outfile # GNU tr 1.22 或更高版本

# 将每一行前导的“空白字符”(空格,制表符)删除 # 使之左对齐 sed 's/^[ t]*//' # 见本文末尾关于't'用法的描述

# 将每一行拖尾的“空白字符”(空格,制表符)删除 sed 's/[ t]*$//' # 见本文末尾关于't'用法的描述

# 将每一行中的前导和拖尾的空白字符删除 sed 's/^[ t]*//;s/[ t]*$//'

# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置) sed 's/^/ /'

# 以79个字符为宽度,将所有文本右对齐 sed -e :a -e 's/^.{1,78}$/ &/;ta' # 78个字符外加最后的一个空格

# 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前 # 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充 # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。 sed -e :a -e 's/^.{1,77}$/ & /;ta' # 方法1 sed -e :a -e 's/^.{1,77}$/ &/;ta' -e 's/( *)1/1/' # 方法2

# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar” sed 's/foo/bar/' # 只替换每一行中的第一个“foo”字串 sed 's/foo/bar/4' # 只替换每一行中的第四个“foo”字串 sed 's/foo/bar/g' # 将每一行中的所有“foo”都换成“bar” sed 's/(.*)foo(.*foo)/1bar2/' # 替换倒数第二个“foo” sed 's/(.*)foo/1bar/' # 替换最后一个“foo”

# 只在行中出现字串“baz”的情况下将“foo”替换成“bar” sed '/baz/s/foo/bar/g'

# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换 sed '/baz/!s/foo/bar/g'

# 不管是“scarlet”“ruby”还是“puce”,一律换成“red” sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数的sed都有效 gsed 's/scarlet|ruby|puce/red/g' # 只对GNU sed有效

# 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。 # 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除 sed '1!G;h;$!d' # 方法1 sed -n '1!G;h;$p' # 方法2

# 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”) sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

# 将每两行连接成一行(类似“paste”) sed '$!N;s/n/ /'

# 如果当前行以反斜杠“”结束,则将下一行并到当前行末尾 # 并去掉原来行尾的反斜杠 sed -e :a -e '/$/N; s/n//; ta'

# 如果当前行以等号开头,将当前行并到上一行末尾 # 并以单个空格代替原来行头的“=” sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'

# 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567” gsed ':a;s/B[0-9]{3}>/,&/;ta' # GNU sed sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta' # 其他sed

# 为带有小数点和负号的数值增加逗号分隔符(GNU sed) gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/12,3/g;ta'

# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行) gsed '0~5G' # 只对GNU sed有效 sed 'n;n;n;n;G;' # 其他sed 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值