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

本文详细介绍了在处理文本文件时遇到的^M字符问题,包括其来源、影响及解决方法。通过使用VIM命令、dos2unix工具和批量转换命令,成功解决了Shell脚本中统计信息不准确的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景
昨天写了一个expect脚本用来做 板卡的自动化测试,获取framer设备的link up/down信息 定向到log文件里面。为了方便分析和处理,使用shell 脚本处理这个log文本。
主要思路是将log中的特定行输出至新的new_log文件,对new_log文件中的词语进行拆分、比较,对设备link up/down 的状态信息进行统计。
初步写了一个shell脚本后,发现对设备的统计信息明显不对。为了测试程序,伪造了一个log文本,就是自己复制粘贴的数据;处理之后,发现统计信息没什么问题。。继续对源文件进行处理,还是有问题。百思不得其解。。。。
二:发现问题
经过伪造的log与new_log的对比分析发现,new_log文本里每行的末尾多了一个^M;利用shell鞋的分词程序发现,这个^M竟然与末尾单词是一个整体,怪不得统计信息有问题;单纯比较字符串的话,肯定是有问题的;
vim打开 new_log 的显示如下:

     CPU Normal^M
     Framer Host Link Up^M
     CPU Normal^M
     Framer Host Link Down^M

分词log如下:

CPU
Normal^M
Framer
Host
Link
Up^M

三、解决问题
发现这个问题之后,就得想办法去除^M 以及找到^M出现的原因;
经过百度,发现:

1. 在windows下的文本文件的每一行结尾,都有一个回车('\n')和换行('\r')
2. 在linux下的文本文件的每一行结尾,只有一个回车('\n');
3. 在Mac下的文本文件的每一行结尾,只有一个换行('\r');

而在linux下打开windows编辑过的文件,就会在行末尾显示^M;
这个^M的在vim下的输入是:

ctrl+v <----> ^
ctrl+m <----> M

四:解决方法
1:首先想到的字符串的替换
利用VIM的命令行输入:

%s/^M$//g

解释:% 指匹配整个文件,s 是置换的意思,^M 注意要用 Ctrl + V Ctrl + M 来输入,M 后面的 $ 代表匹配行尾的内容,最后的 g 则表示每行中匹配到的内容都要置换;
2:dos2unix工具

dos2unix Filename

3:批量转换

find ./ -type f -print0 | xargs -0 dos2unix

或者

find ./ -type f print0 | xargs -0 sed -i 's/^M$//'

即可。
五:后记
找到了解决方法,问题自然很快就解决啦。目前自动化脚本运行非常良好。分析结果,很直观。不过,这只是查找问题的第一步。
BTW,昨天是元宵节,解决完这个问题就直接回去了,今天补充的昨天的记录。

<think>好的,用户想查看.bashrc文件末尾的常见内容或配置示例。我需要先回忆一下相关的知识,并结合提供的引用资料来组织答案。 首先,根据引用[2],.bashrc通常用于设置环境变量、别名和函数。例如,添加PATH的配置。另外,引用[4]提到在/etc/bashrc中添加环境变量需要注意登录shell和非登录shell的区别,但用户的问题是关于用户自己的.bashrc文件,所以重点应放在用户常见的配置上。 用户可能想知道哪些配置通常放在文件末尾,比如自定义提示符、别名、环境变量等。可能需要分点说明,每个部分给出示例,并确保使用正确的LaTeX格式。例如,设置PATH可以用代码块展示,同提到其他常见配置如别名、函数等。 还要注意引用资料中的示例,比如引用[1]中的代码片段展示了如何加载.bashrc,但用户的问题不涉及这部分。引用[3]提到可以修改.bashrc来定义函数和别名,这需要包含在回答中。 需要检查是否有必要提到不同shell类型的加载情况,但用户的问题更侧重于内容示例,可能不需要深入讨论profile和bashrc的区别,但可以简要提及以帮助理解。 最后,生成相关问题要围绕.bashrc的配置、常见设置、调试等,确保问题相关且有助于用户进一步探索。</think>### .bashrc 文件末尾常见内容示例 `.bashrc` 文件末尾通常包含用户自定义的环境变量、别名、函数或第三方工具的初始化脚本。以下是常见的配置示例: --- #### 1. **设置环境变量** 用于定义或扩展全局变量(如 `PATH`): ```bash # 将用户本地bin目录添加到PATH export PATH="$PATH:$HOME/.local/bin" # 设置Java环境变量 export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64" export PATH="$JAVA_HOME/bin:$PATH" ``` --- #### 2. **定义别名(Aliases)** 简化常用命令或添加默认参数: ```bash # 简化文件列表查看 alias ll='ls -alF' # 强制删除确认 alias rm='rm -i' # 快速进入目录 alias projects='cd ~/Documents/projects' ``` --- #### 3. **自定义Shell提示符(PS1)** 修改终端提示符样式: ```bash # 显示用户名、主机名和当前目录 PS1='\[\e[32m\]\u@\h:\[\e[34m\]\w\$\[\e[0m\] ' # 带Git分支的提示符(需Git支持) parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } PS1='\[\e[33m\]\w\[\e[36m\]$(parse_git_branch)\[\e[0m\] \$ ' ``` --- #### 4. **加载外部工具或脚本** 激活第三方工具的环境配置: ```bash # 初始化conda环境 if [ -f "$HOME/miniconda3/etc/profile.d/conda.sh" ]; then . "$HOME/miniconda3/etc/profile.d/conda.sh" fi # 加载nvm(Node版本管理器) export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" ``` --- #### 5. **定义函数** 封装常用操作逻辑: ```bash # 快速创建并进入目录 mkcd() { mkdir -p "$1" && cd "$1" } # 查找文件内容 ftext() { grep -rnw '.' -e "$1" } ``` --- #### 6. **其他个性化设置** ```bash # 设置默认编辑器 export EDITOR="vim" # 禁用Ctrl+S锁屏 stty -ixon # 历史命令增强配置 HISTSIZE=5000 HISTTIMEFORMAT="%F %T " ``` --- ### 注意事项 - **生效方式**:修改后需执行 `source ~/.bashrc` 或重新打开终端[^2]。 - **作用范围**:仅对当前用户的**交互式非登录Shell**生效(如终端窗口)[^4]。 - **与 `~/.profile` 的区别**:环境变量若需在图形界面程序(如IDE)中生效,建议同添加到 `~/.profile`[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值