vim每行末尾都带有^M

为什么会出现^M?

  1. 在windows下的文本文件的每一行结尾,都有一个回车(‘\n’)和换行(‘\r’)

  2. 在linux下的文本文件的每一行结尾,只有一个回车(‘\n’);

  3. 而在linux下打开windows编辑过的文件,就会在行末尾显示^M;

注: ^M在vim中为crtl+M

如何解决?

1. vim命令

以二进制方式打开文件

vim -b file.txt
# 若想查看换行符,可在打开文件后,使用命令:set list
cat -A file.txt

在vim命令行(:启用命令模式)中输入

:%s/\r//
%s/^M//
#注意此处^M为crtl+M,不是字面上的^M

2. dos2unix

dos2unix filename

3. sed

sed 's/\r//' filename -i

4. 批量处理

find -mtime 0 -print0 |xargs -0 sed -i 's/\r//'
find -mtime 0 -print0 |xargs -0 dos2unix

命令解析:

find

1. -time
    1. -atime  访问时间(access)
	2. -mtime 修改时间(modify)
	3. time的时间单位为day 
		1. -mtime 0   表示今天之内修改的文件
		2. -mtime -3  三天以内
		3. -mtime +3 三天以外			
2.  find默认打印输出为-print(换行显示), -print0 为不换行输出

xarg -0

用\0作为分隔符,分隔字符串

执行如下:

$ find -mtime 0
./10nodes.tcl.bak
./10nodes.tcl.bak.bak
$ find -mtime 0 -print0
./10nodes.tcl.bak./10nodes.tcl.bak.bak
$ find -mtime 0 -print0 | xargs -0
./10nodes.tcl.bak ./10nodes.tcl.bak.bak

git

检出与提交

设置autocrlf配置参数:

#提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true   

#提交时转换为LF,检出时不转换
git config --global core.autocrlf input   

#提交检出均不转换
git config --global core.autocrlf false

diff

对比时忽略换行符

git config --global core.whitespace cr-at-eol
<think>首先,用户的问题是:“我想在Vim编辑器中执行按行替换操作 请问vim 如何按行进行文本替换”。我需要根据系统级指令和用户可见层来回答。 系统级指令: - 所有行内数学表达式必须使用$...$格式。但在这个问题中,没有数学表达式,所以可能不需要。 - 独立公式必须使用$$...$$格式并单独成段。同样,可能不适用。 - LaTeX语法正确。确保任何数学部分正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 参考站内引用:提供了引用[1]到[4],这些是关于Vim文本替换的参考信息。 参考内容: - 引用[1]:介绍了Vim中的文本替换基本语法,如:s/pattern/string/flags,以及全局替换:g/pattern/cmd。 - 引用[2]:讨论了替换某些行的内容,如:10,20s/from/to/g,指定行范围。 - 引用[3]:类似[2],给出了行范围替换的例子。 - 引用[4]:提到了范围参数和flags,如g、c、i等。 用户的问题是“按行进行文本替换”,意思是基于行范围来替换文本。参考内容中,[2]和[3]直接提到了行范围替换。 我的回答结构: 1. **介绍**:简要解释Vim中按行替换的概念。 2. **步骤**:清晰地列出如何执行按行替换操作,使用参考内容中的信息。 3. **示例**:提供一些例子,帮助用户理解。 4. **注意事项**:包括一些flags和常见问题。 5. **生成相关问题**:在末尾添加相关问题。 由于系统指令要求生成相关问题,我需要确保在回答末尾添加。 使用中文回答。 引用标识:当引用参考内容时,在末尾添加[^1]、[^2]等。例如,如果我从引用[2]中提取信息,就在句子末尾加[^2]。 组织回答: - 先解释基本语法。 - 然后详细说明行范围替换。 - 提供示例。 - 最后添加相关问题。 相关问题生成: - 基于主题,生成一些相关问题,如优化、常见错误、其他替换方式等。 - 类似于示例中的“快速排序”相关问题。 完整回答结构: 1. 开头:直接回答问题。 2. 主体:分步解释。 3. 结尾:添加相关问题。</think>### Vim中按行进行文本替换的方法 在Vim编辑器中,按行进行文本替换是一种高效的操作,允许您指定行范围来替换特定内容。这通过Vim的替换命令(`:s`)结合行范围参数实现。下面我将逐步解释语法、操作步骤和示例,确保您能轻松掌握。参考了Vim官方文档和常见用法,以下内容基于真实可靠的实践。 #### 基本语法和步骤 1. **核心命令格式**: Vim的替换命令使用`:s`(substitute的缩写),基本语法为: ``` :[range]s/{pattern}/{replacement}/[flags] ``` - `[range]`:指定行范围,例如`10,20`表示第10行到第20行。如果不指定范围,默认只替换当前行。 - `{pattern}`:要查找的文本模式(支持正则表达式)。 - `{replacement}`:替换后的文本。 - `[flags]`:可选标志,如`g`(全局替换所有匹配)、`c`(每次替换前确认)、`i`(忽略大小写)等[^4]。 2. **指定行范围的方法**: - **绝对行号**:直接输入起始和结束行号,例如`:10,20s/old/new/g`表示替换第10行到第20行中的所有"old"为"new"。 - **相对位置**: - 使用`.`表示当前行,例如`:.,$s/old/new/g`替换当前行到文件末尾。 - 使用`$`表示最后一行,例如`:1,$s/old/new/g`替换整个文件(等价于`:%s/old/new/g`)。 - 使用`+`或`-`偏移,例如`:10,+5s/old/new/g`替换第10行到第15行(10+5)。 - **标记辅助**:如果使用`m`命令设置标记(如标记a为`ma`),则可用`: 'a,'b s/old/new/g`替换标记a到b之间的行[^2][^3]。 3. **常见flags的使用**: - `g`:替换行内所有匹配(默认只替换第一个匹配)。 - `c`:交互式替换,每次询问确认。 - `i`:忽略大小写,使搜索更灵活。 - 组合使用:例如`:10,20s/old/new/gc`表示在第10-20行替换所有"old",并逐一确认[^4]。 #### 操作示例 假设您有一个文本文件,需要替换特定行内的内容。以下是常见场景的示例: - **示例1:替换指定行范围的所有匹配** 命令:`:10,20s/error/fix/g` 效果:将第10行到第20行中的每个"error"替换为"fix",且所有出现都替换(`g`标志)[^2][^3]。 - **示例2:从当前行到末尾替换** 命令:`:.,$s/hello/world/gi` 效果:从光标所在行开始到文件末尾,替换所有"hello"(忽略大小写)为"world"。 - **示例3:交互式替换(带确认)** 命令:`:1,50s/data/value/gc` 效果:替换第1行到第50行的"data"为"value",但每次替换前弹出提示,您可按`y`确认或`n`跳过[^4]。 - **示例4:使用标记的行范围替换** 1. 先在起始行设置标记:按`ma`(将当前行标记为a)。 2. 移动到结束行:按`mb`(将当前行标记为b)。 3. 执行替换:`: 'a,'b s/old/new/g` 效果:替换标记a到b之间的所有行中的"old"为"new"[^2]。 #### 注意事项 - **正则表达式支持**:`{pattern}`支持正则表达式(如`s/\d+/number/g`替换所有数字),但特殊字符需转义(如`s/\./dot/g`替换点号)。 - **性能优化**:对于大文件,避免使用全局替换(如`%s`),优先指定精确行范围以提高速度。 - **错误处理**:如果替换未生效,检查`{pattern}`是否正确或使用`:set hlsearch`高亮显示匹配项。 - **撤销操作**:替换后可按`u`撤销,Vim支持多级撤销。 通过以上步骤,您可以灵活地在Vim中按行替换文本。如果需要更高级功能(如变量替换),可参考Vim帮助文档(`:help substitute`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值