linux如何将调试信息中的换行符会自动转换为回车+换行?

linux如何将调试信息中的换行符会自动转换为回车+换行?,第1张

linux系统文本文件的换行只是一个换行符。即“\n”,windows是回车加换行"\r\n"。你的文件是用linux生成的,所以每行的结尾只有一个换行符(\n),这样产生的文件在windows系统的一些文本编辑器中显示时是不会自动换行的。

你可以验证一下文件的属性:用vim编辑器打开文档,然后在命令模式下输入“set fileformat?”看一下文件是dos的还是unix类型的。结果应该是unix。

可以在linux下使用unix2dos命令将文件由unix类型转换为dos类型。

CR :Carriage Return,对应ASCII中转义字符\r ,0x0D(asc码是13) 指的是“回车”   \r是把光标置于本行行首

LF :Linefeed,对应ASCII中转义字符\n ,0x0A(asc码是10) 指的是“换行”    \n是把光标置于下一行的同一列

CRLF:Carriage Return &Linefeed,\r\n , 0x0D + 0x0A ,指的是回车换行    \r\n把光标置于下一行行首 

^M的原因 : ^M 注意要用 Ctrl + V Ctrl + M 来输入

Dos、Windows 格式的文件,用 0D 0A (CR+LF)作为换行符,而Unix 的则是以0A(LF) 作为换行符.所以dos 底下的文本文件到了unix的话,换行符就会多出来一个 0D(CR) 显示为 ^M,在linux中vim中无法显示\r

因为ascii中对应的不是linux中的标准acsii字符,其实其对应的ASCII码十进制形式是: 13 (无显示形式)对应的八进制形式 15 (显示为^M)从二进制层面来理解,即可以删除换行符前面对应的字符字节(我瞎编的,应该对的),在字符层面直接删除^M这个字节即可

方法1:

在命令模式下:输入:%s/^M//g 然后,回车即可替换

注,其中”^M”的输入,分别是“Ctrl+v”、“Ctrl+M”键生成的

方法2:

使用vi打开文本文件

vi dos.txt

命令模式下输入

:set fileformat=unix

:w

方法3:

使用sed 工具

sed ’s/^M//’ filename >tmp_filename

方法4:

既然window下的回车符多了‘\r’,那么当然通过删除‘\r’ ,也可以实现:

tr -d ‘\r’

或者:

sed -i 's/\r//' startup.sh

window下默认是 \r\n

linux下是\n

unix下是\r

  现在, 我们看看本文开头部分的问题。 假设有一个linux下的unix.txt文件,  那么, 它在文件中的换行标志是:\n, 现在把unix.txt拷贝靠Windows上, 那好啊, Windows那双犀利的眼神仿佛是在对unix.txt文件说: 别跟我整什么\n, 我只认识文件中的\r\n, 如果你这个unix.txt文件里面有\r\n, 那我就认为是换行符, 否则, 我不认你。 如此一来, Windows压根就找不到unix.txt中的\r\n, 所以, 对于Windows而言, 压根就没有发现unix.txt有任何换行, 所以, 我们从Windows上看到的unix.txt文件显示在一行里面。 

一)通过vi编辑器来替换。

vi/vim 中可以使用 :s 命令来替换字符串。

:s/well/good/ 替换当前行第一个 well 为 good

:s/well/good/g 替换当前行所有 well 为 good

:n,$s/well/good/ 替换第 n 行开始到最后一行中每一行的第一个 well 为 good

:n,$s/well/good/g 替换第 n 行开始到最后一行中每一行所有 well 为 good

n 为数字,若 n 为 .,表示从当前行开始到最后一行

:%s/well/good/(等同于 :g/well/s//good/) 替换每一行的第一个 well 为 good

:%s/well/good/g(等同于 :g/well/s//good/g) 替换每一行中所有 well 为 good

可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#well/#good/# 替换当前行第一个 well/ 为 good/

:%s#/usr/bin#/bin#g 可以把文件中所有路径/usr/bin换成/bin

(二)直接替换文件中的字符串。(此法不用打开文件即可替换字符串,而且可以批量替换多个文件。)

1.perl命令替换,参数含义如下:

-a    自动分隔模式,用空格分隔$_并保存到@F中。相当于@F = split ”。分隔符可以使用-F参数指定

-F    指定-a的分隔符,可以使用正则表达式

-e    执行指定的脚本。

-i<扩展名>   原地替换文件,并将旧文件用指定的扩展名备份。不指定扩展名则不备份。

-l    对输入内容自动chomp,对输出内容自动添加换行

-n    自动循环,相当于 while(<>) { 脚本}

-p    自动循环+自动输出,相当于 while(<>) { 脚本print}

用法示例:

perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

将所有C程序中的foo替换成bar,旧文件备份成.bak

perl -p -i -e "s/shan/hua/g" ./lishan.txt ./lishan.txt.bak

将当前文件夹下lishan.txt和lishan.txt.bak中的“shan”都替换为“hua”

perl -i.bak -pe 's/(\d+)/ 1 + $1 /ge' file1 file2

将每个文件中出现的数值都加一

2.sed命令下批量替换文件内容   

格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` 文件名

-i 表示inplace edit,就地修改文件

-r 表示搜索子目录

-l 表示输出匹配的文件名

s表示替换,d表示删除

示例:sed -i "s/shan/hua/g"  lishan.txt

把当前目录下lishan.txt里的shan都替换为hua       各个Linux详细命令介绍及应用可如下进行查找


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8403144.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存