Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法

news2024/9/17 8:29:59

去除 vi/vim 和 git diff 中的 ^M 问题解决办法

  • 问题现象
  • 初步分析
  • 进一步查看
  • 问题解决
    • Source Insight
    • dos2unix
    • Nodpad++
    • Vim
    • sed 命令
    • 综上
  • Reference

问题现象

git diff 时发现下面的情况,新修改的代码之处都是携带 ^M 字符,
在这里插入图片描述

初步分析

肯定是因为 Windows 和 Linux 系统之间换行符标准不同导致的。

  • CR(Carriage Return):ASCII 码中的控制符,代表回车。意思是将光标移到当前行的首位。用转义序列 "\r" 表示;
  • LF(Line Feed):ASCII 码中的控制符,代表换行。意思是代表一行文本的结束,将光标移到下一行,用转义序列 "\n" 表示。
  1. Windows 系统采用 CRLF(回车+换行)表示下一行,即 "\r\n"
  2. Linux/UNIX 系统采用 LF 表示下一行,即 "\n"
  3. MAC 系统采用 CR 表示下一行,即 "\r"

在这里插入图片描述

进一步查看

通过 vim 打开查看文件,设置 :set list 进一步查看,没看出差异。
在这里插入图片描述

再查看文件类型,显示如下:

file  fileName.c
fileName.c: C source, Unicode text, UTF-8 text, with CRLF line terminators

上面可以明显看出提示有 CRLF 结束UTF-8 格式文本。

再次通过 cat -A fileName 命令查看文件内容如下,原来,整个文件全都是携带 ^M 字符。
在这里插入图片描述
若使用 od 命令(输出指定二进制、八进制、十六进制或其它格式编码的字符)查看文件内容截图如下:

od -tc fileName

在这里插入图片描述
通过 od 命令查看,可以很清晰的看到 CRLF(回车+换行)符号。

问题解决

既然已经定位出问题,那么接下来就是看怎么修改文本行结尾 ^M 控制字符。
本篇针对不同场景,有不同解决办法。

Source Insight

依次选择【Options】->【Preferences】->【Files】->【Other】->【Default line ending:】选择 Unix(LF) 即可。

在这里插入图片描述

dos2unix

直接使用 linux 工具 dos2unix

dos2unix fileName

Nodpad++

依次选择 【编辑(E)】->【文档格式转换(E)】->【转为 Unix(LF)
在这里插入图片描述

Vim

前面提到直接使用 vi/vim fileName 是没看到 ^M ,但是通过 cat -A fileName 命令是可以看到 ^M 。 因此这里需要使用 vim -b fileName 命令来查看。

vim -b fileName
:% s/^M$//g              #vim 底线命令模式(Last line mode)
:% s/^M//g               #vim 底线命令模式(Last line mode)
:% s/\r//g               #vim 底线命令模式(Last line mode)

注意:上面的 ^M 需要通过 CTRL+V 和 CTRL+ M ,即按住CTRL键,然后依次按下 V 和 M 键。

sed 命令

sed 命令同上面的 vim 方式基本一样,只是命令行的差异。

sed -i s/^M$//g fileName
sed -i s/^M//g fileName
sed -i s/\r//g fileName

综上

综上是几种解决 ^M 问题的办法。
想必仔细阅读的读者心里会有一个小的疑问,为何最后的两种方式中, ^M 可以用 \r 替换呢?
这是因为,前面描述 ASCII 和 回车、换行符之间关系的时候提到:

  • CR,用转义序列 "\r" 表示;
  • LF,用转义序列 "\n" 表示;
  • CRLF,用转义序列 "\r\n" 表示;

我们在 Linux 环境中使用 bash 查看文本,在文本行结尾通常会看到(显示)$^M$,其中 ^M 就表示回车(CR,用转义序列 "\r" 表示),$ 表示换行(用转义序列 "\n" 表示)。即:

  • "\r" 在类Unix系统下会被显示为 ^M
  • "\n" 在类Unix系统下会被显示为 $

So,读者认为命令行中的 "\r"^M 是否可以相互替换呢?

Reference

ASCII 表
Ascii码表
How to remove CTRL-M (^M) characters from a file in Linux
What is the ^M character called?
https://www.jianshu.com/p/cff726d86978

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐5款常用的有限元分析CAE软件

正如我们之前谈到的,计算机辅助软件有助于进行有限元分析。但是我们如何识别好的 CAE 软件呢?CAE 软件必须满足以下要求才能被纳入其类别使用户能够通过图形用户界面 (GUI) 创建模拟允许在模拟中测试组件,同时具有可自定义的环境变量协助优化…

JAVA队列-接口

前言 说到队列,大家都不陌生,很多场景都需要使用到队列,今天我们一起学习JDK提供的队列源码 类图 Queue接口的实现类有很多 从中,我们看到几个熟悉的,BlockingQueue 阻塞队列、Deque 双端队列 Queue 官方介绍: A collection designed for holding elements prior to proce…

MORPHVOX PRO 变声器 软件 Crack

MORPHVOX PRO 变声器 变音的全新层次 在网上聊天和游戏中使你变音 它具有超高语音学习技术,背景取消和高音质特点,将变音带向全新层次。 上好的变音质量 聆听MorphVOX Pro上好的变音质量。 *变音的音频因人而异,但它确实是同一个说话者发出…

国内爬虫图鉴

文章目录爬虫图鉴1.三个问题2.互联网上的爬虫2.1豪哥与爬虫2.2爬虫简介2.3APP身边的爬虫2.4爬虫排名1、排名第一的是出行2、排名第二的是社交。3、排名第三的是电商。4、接下来是 O2O 和搜索引擎。5、最后再说说政府部门。3.关于爬虫的几点疑问4.爬虫的TopN爬虫图鉴 本文案例来…

【数学建模】层次分析法(AHP)-Python实现

1 前言 本文主要讲解层次分析法(AHP)的python实现,后续会跟进实例分析 2 代码实现 导入包 import numpy as np2.1 构造判断矩阵 判断矩阵一般采用专家意见法,也就是德尔菲法。但是比赛的时候也没有什么专家,大家自…

2019-arXiv-Edge Contraction Pooling for Graph Neural

2019-arXiv-Edge Contraction Pooling for Graph Neural Paper: https://arxiv.org/abs/1905.10990 Code: https://github.com/pyg-team/pytorch_geometric/tree/master/benchmark/kernel 图神经网络的边缘收缩池化 池化层可以使GNN对抽象的节点组而不是单个节点进行推理。为…

【基础篇】5 # 链表(下):写好链表代码的六个实用技巧

说明 【数据结构与算法之美】专栏学习笔记 技巧一:理解指针或引用的含义 指针或引用都是存储所指对象的内存地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。 例如: p —> next q:表示 p 结点中的 ne…

opencv——Canny边缘检测

1、Canny边缘检测流程a、使用高斯滤波器,以平滑图像,滤除噪声。b、计算图像中每个像素点的梯度强度和方向。c、应用非极大值抑制,以消除边缘检测带来的杂散效应。d、应用双阈值检测来确定真实的和潜在的边缘。e、通过抑制孤立的弱边缘最终完成…

webpack4和webapck5的及新特性

30.webpack——webpack5新特性(启动、持久化缓存、资源模块、URIs、moduleIds和chunkIds、tree shaking、nodeJs的polyfill被移除、模块联邦)_俞华的博客-CSDN博客_chunkids 1、新特性1——启动命令 webpack4启动devServer,用的命令是webpac…

clickhouse库通过字段分组后获取排序后每天的前N条数据

各种查资料,都没找到,建议还是多看文档 方法1 :简单便捷: order by date,count desc limit 5 by date (取每天前5条数据,5可以随便换) sql可以随便写: 统计每天学生人数,按降序排序&#xff…

高级Spring之jdk 和 cglib 在 Spring 中的统一

Spring 中对切点、通知、切面的抽象如下 切点:接口 Pointcut,典型实现 AspectJExpressionPointcut 通知:典型接口为 MethodInterceptor 代表环绕通知 切面:Advisor,包含一个 Advice 通知,PointcutAdvisor…

关于构建校园能源管理平台的研究进展

摘要:能源与发展的矛盾已成为当今世界关注的焦点,高等学校做为一个特定的环境,近年来办学规模、校园面积、师生数量急剧增长,对能源的消耗也大幅提高。为抑制能源不合理增长,实现低碳发展,本文通过对校园能…

Go protobuf 的简单应用

环境搭建 安装 protobuf 编译器 https://github.com/protocolbuffers/protobuf/releases 解压,将bin目录加入环境变量 安装 protocol-gen-go 生成器 用于生成Go代码 https://github.com/protocolbuffers/protobuf-go/releases 解压,将可执行文件加…

第27章 分布式缓存数据库的定义实现

1 Core.HashHelper using System.Security.Cryptography; namespace Core { /// <summary> /// 【哈希助手--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过1个指定哈希加密算法生成1个唯一性的字符串(当前安全性较强的SHA-2包括有&#xff1a;SHA-2…

九龙证券|三胎概念股拉升…港股跳水,恒生科指重挫近5%

兔年首个交易日&#xff0c;A股迎来开门红&#xff0c;沪指开盘即打破3300点&#xff0c;创业板指一度涨近3%&#xff1b;港股却大幅下挫&#xff0c;恒生科技指数一度跌超5%。 详细来看&#xff0c;A股方面&#xff0c;两市股指全线高开&#xff0c;沪指开盘即打破3300点&…

WebDAV之葫芦儿·派盘+Keepass2Android

Keepass2Android 支持WebDAV方式连接葫芦儿派盘。 推荐一款密码管理器,允许人们使用复杂的组合进行登录,而不必记住所有的组合。 Keepass2Android可以支持大多数安卓互联网浏览器, Android设备上同步软件,还支持通过WebDAV添加葫芦儿派盘。

Versal系列0-AI Engine与Systolic Array

最近在开发VCK190时&#xff0c;发现Xilinx Versal系列的AI engine&#xff08;AIE&#xff09;&#xff0c;其实和Systolic Array&#xff08;SA&#xff09;有着很相似的地方。Xilinx工程师在研发AIE时&#xff0c;应该是有所借鉴SA的。Systolic Array最早是H. T. Kung于1982…

k8s工具kubepi介绍

目录 部署安装 登录 配置 日常操作 Kubepi是一个简单高效的k8s集群图形化管理工具&#xff0c;方便日常管理K8S集群&#xff0c;高效快速的查询日志定位问题的工具。 部署安装 持久化部署 # 创建持久化目录 mkdir -p /opt/kubepi # 安装 sudo docker run --privileged …

通信原理笔记—绪论

目录 通信的基本概念&#xff1a; 通信的目的&#xff1a;要克服某种障碍&#xff0c;实现信息高效、准确地传递。 狭义的通信系统&#xff1a; 广义的通信系统&#xff1a; 数字通信系统的基本组成&#xff1a; 数字通信的特点&#xff1a; (1)抗噪声和干扰能力强&#…