liux文件的每行末尾^M$ 和$

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

问题:

之前在linux下写了个shell脚本,然后发给一个同事帮我修改(他用的是windows的系统),修改好了之后又发给了我,我直接就覆盖了原来的文件,但是在脚本执行的时候遇到了个问题:



manage_dir=`cat sdm_cristel_external_server.cfg | grep "MANAGE_DIRECTORY" | awk -F "=" '{print $2}' `
echo $manage_dir


if [ "$manage_dir" = "YES" ];then
echo "manage dir"
elif [ "$manage_dir" = "NO" ];then
echo "can not manage dir"
else
echo "please in put a flag"
fi

我在sdm_cristel_external_server.cfg文件里的设置MANAGE_DIRECTORY=YES,但是上面的测试脚本总是输出:please in put a flag


原因:

Unix系统里,每行结尾只有“<换行>",即"\n";windows系统里面,每行结尾是"<换行><回车>" ,即”\n\r"。

一个直接的后果是,Unix的文件在windows打开的话,所有的文字会变成一行;windows文件在Unix里打开的话,在每行的结尾可能会多出一个^M符号。但这个符号通常是直接看不出来的,可以用命令cat -A filename 来查看。


如:windows文件在linux下打开(用cat查看)

# Restore Server configuration^M$
#It indicates which server it is^M$
EXTERNAL_SERVER_NAME_CRISTEL=""^M$
#It is the server IP address^M$
EXTERNAL_SERVER_ADDRESS_CRISTEL=""^M$
#It is the used account for access and transfer to this restore server^M$
EXTERNAL_SERVER_ACCOUNT_CRISTEL=""^M$
#Define the transfer directory in restore server^I^M$
SERVER_TRANSFER_DIRECTORY_CRISTEL=""^M$
#Define the valid directory in restore server^M$
SERVER_VALID_DIRECTORY_CRISTEL=""^M$
#Define the restored directory in restore server^M$
SERVER_RESTORED_DIRECTORY_CRISTEL=""^M$
^M$


解决:

法1. 把windows下发过来的文件,在linux下再重写一遍

法2. 用sed解决

manage_dir=`cat sdm_cristel_external_server.cfg | grep "MANAGE_DIRECTORY" | awk -F "=" '{print $2}'  | sed   -i   's/^M$//g`


Linux 中 ^M 转换 linux文件有^M, 如何转换,是因为mac,windowslinux 下的换行符不一样 立即下载

相关推荐

为什么linux下代码文档有^M,怎么去除?

Linux断行格式有关.DOS(Windows系统)使用的断行字符为^ M $,我们称为CR与LF两个符号。而在Linux底下,则是仅有LF($)这个断行符号。在Linux底下打开Windows的档案时,由于DOS的断行符号是CRLF,就会多了一个^ M的符号出来。在这样的情况下,如果是一个shell脚本的程序档案,将可能造成“程序无法执行“的状态〜因为他会误判程序所下达的指令内容。 处理方...

熊孩子的博客??? 9441

linux系统^M格式问题

内网服务器断电后,服务器项目启动不了一直报No such file 然后就去看了下发现命令文件存在啊。检查到怀疑人生,最后确认没有问题,就怀疑是不是文件格式出问题了 使用 cat -A file 发现每行末尾多了 ^M$ 难怪一直报找不到文件了。 于是使用命令替换下然后发现替换不了。 百度下才知道, ^M 这个符号需要用ctrl+vctrl+m 打出来得才可以。感觉这个很狗血。 sed -i '...

a807719447的专栏 1063

linux处理 ^M

linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件。我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器Linux编辑器对文件行末的回车符处理不一致。 删掉所有的^M的方法有: 1.使用vim打开文件 ,命令模式下输入:set fileformat=unix ,然后:w退出。 2.利用正则表达式,使用vim打开文件,输入 :vim切换到命令模式,然后

合抱之木,生于豪末。A New World 1255

Linux案例之处理^M特殊字符

◆ 产生原因: DOS (Windows 系统)使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 下,则是仅有 LF ($) 这个断行符号。所以,当在 Linux 下打开Windows文件时,就会多了一个 ^M 的符号。 ◆ 处理方案: dos2unix 命令: dos2unix filename sed 命令: sed -i 's/^M//g' fil...

宅羽的博客 2454

linux文件末尾$字符导致命令中断,ini文件多了个dos的^M结尾符号,导致linux下脚本程序不能运行...

[omcr@lnlte2dmr-tdl legacy]$ cat -A ums_del_mr_files_cfg.iniMrFileDiskMountPoint=/home^M$MrFileDiskSpaceQuotaThresholdRatio=70^M$MrFileReserveDayMin=7^M$MrFileReserveDayMax=31^M$MRF_Path=/home/mrftp/m...

weixin_42311427的博客 978

linux 查看文件的换行符 回车 换行

linux 查看文件的换行符 回车 换行

global_coding的博客 1万+

Linux系统中文件末尾出现^M的原因及解决办法

在开发过程中,有时候Linux系统中文件末尾出现^M,对于不同系统,有不同的换行符号: 在windows下的文本文件的每一行结尾,都有一个回车(’\n’)换行(’\r’) 在linux下的文本文件的每一行结尾,只有一个回车(’\n’); 在Mac下的文本文件的每一行结尾,只有一个换行(’\r’); 因此:^M出现的原因: 在linux下打开windows编辑过的文件,就会在行末尾显示^M; 对此的解决办法就是通过字符替换,将^M换掉,具体方法如下: 利用vim打开文件,然后输入vim 命令

kmnf1的博客 5281

删除vim打开文件末尾的^M

最近在Windows下写了一个shell脚本,拿到Linux下执行的时候一直提示找不到文件。但是文件明明就存在,在Linux用vi/vim 打开脚本,文件内容不为空,仔细检查脚本内容也没有出错,只是每行 末尾 多出来一个^M 符号。去掉这个^M 符号后就可以正常运行了。 发现这个问题之后,在网络上搜索去除^M 以及找到^M出现的原因;  经过百度,发现: 1. 在windows下的文

iamplane的博客 2591

vim 打开文件末尾带有^M的解决办法

一、背景 昨天写了一个expect脚本用来做 板卡的自动化测试,获取framer设备的link up/down信息 定向到log文件里面。为了方便分析处理,使用shell 脚本处理这个log文本。 主要思路是将log中的特定行输出至新的new_log文件,对new_log文件中的词语进行拆分、比较,对设备link up/down 的状态信息进行统计。 初步写了一个shell脚本后,

sunxiaopengsun的专栏 2265

windows下的代码放到ubuntu上每行末尾都有^M

vi编辑器打开文件,发觉每一行的最后有浅蓝色的字符’^M’。才知道了问题所在 其实并没什么奇怪的,出现这种错误的原因是因为LinuxWindows文本文件的行结束标志不同。在Linux中,文本文件用\n表示回车换行,而Windows用\r\n表示回车换行。所以在Linux中使用Windows的文本文件常常会出现错误。为了避免这种错误,Linux提供了两种文本格式相互转化的命令:dos2unix

kuugamichael的专栏 1715

批量将目录下所有文件进行 dos/unix 格式转换

DOS/WindowsLinux/Unix的文件换行回车格式不同,基于 DOS/Windows 的文本文件在每一行末尾有一个 CR(回车) LF(换行),而 UNIX 文本只有一个换行。把Dos/Windows下的文件移至Linux/Unix系统虽然很多程序不在乎 DOS/Windows 格式的 CR/LF 文本文件,但是有几个程序却在乎 -- 最著名的是 bash,只要一遇到回车,它就会出问

changqing1234的专栏 3万+

文件夹所有文件dos转linux,批量将目录下所有文件进行 dos/unix 格式转换

一、问题产生的原因:DOS/WindowsLinux/Unix的文件换行回车格式不同,基于 DOS/Windows 的文本文件在每一行末尾有一个 CR(回车) LF(换行),而 UNIX 文本只有一个换行。对于换行这个动作,unix下一般只有一个0x0A表示换行("\n"),windows下一般都是0x0D0x0A两个字符("\r\n"),苹果机(MAC OS系统)则采用回车符CR表示下一行...

weixin_33099377的博客 764

Linux 将数据文件的记录分割符\n替换成\r\n,然后入Oracle

Linux 将数据文件的记录分割符\n替换成\r\n,然后入Oracle 编写控制文件ctl,部分内容(截取了部分字段)如下图: 查看文件编码为utf-8,现将文件编码转为gbk,如下图: 替换文件分隔符,使用以下命令: sed -i “s/$/^M/g” cnca.bin 查看文件前几条记录,发现记录分隔符为^MKaTeX parse error: Undefined control seq...

weixin_43451620的博客 1441

Linux下读取Windows下保存的文件,报错信息中出现“^M“时如何解决?【由于WindowsLinux的换行方式不同造成的-提供两种转换方式】

r\n\n^M\r。

昊虹AI笔记 664

windows 文件linux下 m,在linux下,去除^M,将windows格式文件(dos文件)改为unix格式文件...

在Windows系统下编辑的文件,换行符回车的格式为'\r\n',在linux系统下,回车的格式为'\n',在Windows下编辑的文本文件在上传至linux服务器时,回车'\r\n'就显示成^M+'\n'。在Windows环境下,用ultraedit或者notepad plus都有相应的选项可以将Windows下的文本格式文件转换成unix格式文件。比如:notepad plus中“编辑”—&g...

weixin_29117805的博客 914

Windows/Linux 文件换行符转换:5 种工具实测与 sed 避坑指南

本文详细介绍了Windows/Linux文件换行符转换的5种工具实测,包括dos2unix、tr、Vim、sedawk,并深入剖析了sed处理Windows换行符时的典型陷阱。通过实际案例代码示例,帮助开发者高效解决跨平台协作中的换行符问题,提升工作效率。

weixin_28829339的博客 278

linux文件内容的替换

学习

abitnervous的博客 7954
上一篇: shell 中if 做比较
下一篇: 利用sed 命令去掉windows下回车符及空白符
_Black铁木真
博客等级 码龄15年 46粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值