linux命令(44):sed,vim;去掉文件中的^M 符号,去掉行首空格和制表符

去除文件中的^M字符

注:下面的直接粘贴会出错,要重新输入^M

如何输入^M,先 ctrl+v,然后 ctrl+m

第一种方法:

cat -A filename 就可以看到windows下的断元字符 ^M
要去除他,最简单用下面的命令:
dos2unix filename
 
第二种方法:
 
sed -i 's/^M//g' filename
 
第三种方法:
 
#vi filename
 
:1,$ s/^M//g

^M 输入方法: ctrl+V ,ctrl+M
 
第四种方法:
#cat filename |tr -d '/r' > newfile
#^M 可用 /r 代替

 

去掉行首空格或者制表符:

如果确认只是空格:

sed 's/^ *//' infile

如果判断不清行首是空格还是制表符的话, 还可以用这个:

sed 's/^[[:space:]]*//' infile

<think>我们正在处理用户关于Makefile分隔符缺失错误的问题。根据引用内容,该错误通常是由于在规则命令中使用了空格而不是制表符(TAB)引起的。 解决方案核心:确保Makefile中规则(recipe)的命令以TAB字符开头,而不是空格。 步骤: 1. 检查Makefile中所有规则(例如build, clean等)的命令是否以TAB开头。 2. 如果用户使用的是文本编辑器,需要确保编辑器没有将TAB自动转换为空格。 3. 对于常见的编辑器(如VSCode),可以设置将制表符保持为制表符,或者设置Makefile的特定缩进规则。 根据引用[2][3]: - Makefile要求每个规则(rule)的命令(即动作部分)必须使用TAB开头,不能使用空格(即使多个空格也不)。 - 在VSCode中,可以通过安装插件或设置来确保在Makefile中使用TAB。 具体操作建议: 1. 打开Makefile文件。 2. 检查报错(例如报错号在错误信息中给出,如Makefile:5)以及该所在的规则。 3. 将规则命令前的空格替换为TAB(按一次TAB键)。 4. 保存文件并重新运make命令。 另外,引用[3]提供了一个链接,其中可能包含VSCode的配置方法,但用户不一定使用VSCode,因此我们给出通用方法。 如果用户使用VSCode,可以这样设置: - 安装Makefile工具插件(如"Makefile Support")或设置编辑器对Makefile使用制表符。 - 在VSCode底部状态栏,可以看到当前文件的缩进设置(可能是空格制表符)。点击它,然后选择“使用制表符缩进”,并确保“检测缩进”已关闭,或者为Makefile设置特定的缩进规则。 通用配置方法(以VSCode为例): 1. 打开设置(Settings)。 2. 搜索“Makefile”。 3. 如果没有特定设置,可以搜索“Editor: Insert Spaces”并针对Makefile语言覆盖设置,取消勾选(即使用制表符)。 4. 或者,在Makefile文件中,点击右下角的“空格:X”或“制表符大小:X”,然后选择“使用制表符缩进”。 如果用户使用其他编辑器(如vi, emacs等),也需要确保在编辑Makefile时使用TAB而不是空格。 示例Makefile修正: 错误示例(使用空格): clean: rm -f *.o # 这里前面是4个空格(错误) 正确示例(使用TAB): clean: rm -f *.o # 这里前面是一个TAB字符(注意:在显示上可能空格一样,但本质不同) 注意:在Makefile中,只有规则(recipe)部分(即命令部分)需要TAB开头,而变量赋值目标依赖关系则不需要。 根据引用[4]的例子,他们的Makefile格式如下(注意命令前的TAB): all: vmrp vmrp: $(objs) g++ $(objs) -o vmrp # 前面是TAB vmrp.o: $(srcs) $(head) g++ $(opts) $(srcs) # 前面是TAB 因此,用户需要检查自己的Makefile,确保每个规则下的命令都是以TAB开头。 如果用户已经确认使用了TAB但问题仍然存在,可能是编辑器将TAB显示为空格,但实际保存的是TAB?或者反过来?这时可以尝试用二进制查看工具检查文件,或者尝试用`cat -A`(在Linux下)查看文件,TAB会显示为^I。 在Linux下,可以使用以下命令检查: cat -A Makefile 如果空格,会显示为空格(即空格本身),如果是TAB,会显示为^I。 最后,建议用户使用简单的文本编辑器(如nano)重新输入TAB,以避免复杂的编辑器配置问题。 总结:Makefile中规则命令必须使用TAB开头,不能使用空格。用户需要根据自己使用的编辑器进设置,确保在Makefile中使用TAB字符。 相关问题: 1. 如何在不同编辑器中设置Makefile使用TAB缩进? 2. Makefile的语法规则有哪些常见注意事项? 3. 除了分隔符错误,Makefile还有哪些常见错误? 4. 如何调试Makefile的执过程?</think>### Makefile 分隔符缺失错误解决方案 在 Makefile 中遇到「*** 遗漏分隔符」或「*** 缺失分隔符」错误(如 `Makefile:4: *** missing separator. Stop.`),根本原因是 **规则命令(recipe)未使用 TAB 字符开头**,而是使用了空格。以下是详细解决方案: #### 解决方法 1. **检查命令的缩进** Makefile 要求所有规则下的命令必须用 **TAB 字符**(ASCII 0x09)开头,而非空格。例如: ```makefile target: dependencies command1 # ← 必须是 TAB(显示为 4-8 空格宽度) command2 # ← 必须是 TAB ``` 错误示例(用空格缩进): ```makefile clean: rm -f *.o # 错误:空格而非 TAB ``` 2. **编辑器配置**(关键步骤) - **VSCode**: 1. 点击右下角状态栏的 **空格缩进标识**(如"Spaces: 4") 2. 选择 **「Convert Indentation to Tabs」** 3. 确保显示为 **「Tab Size: 4」** 或类似提示 ![VSCode 设置示意](https://example.com/tab-setting.png)(图示:切换为 TAB 缩进)[^3] - **Vim/Neovim**: 在 Makefile 中执: ```vim :set noexpandtab " 禁用空格替换 TAB :set tabstop=4 " 设置 TAB 显示宽度为 4 :retab! " 将现有空格转换为 TAB ``` - **其他编辑器**: 在设置中关闭 **「Expand tabs to spaces」**(将 TAB 转为空格)选项。 3. **验证 TAB 字符** 终端执 `cat -A Makefile`,检查命令: - 正确显示:`^Icommand`(`^I` 表示 TAB) - 错误显示:` command`(空格) 4. **通用修复脚本** 使用 `sed` 替换空格为 TAB: ```bash sed -i 's/^ /\t/' Makefile # 将 4 空格替换为 TAB ``` 或修复所有规则命令: ```bash sed -i -E 's/^([a-z].*:)/\1\n\t/' Makefile ``` #### 示例修正 错误代码(引用[4]): ```makefile all: vmrp vmrp: $(objs) g++ $(objs) -o vmrp # ← 错误:空格 ``` 修正后(TAB 缩进): ```makefile all: vmrp vmrp: $(objs) g++ $(objs) -o vmrp # ← TAB 开头 ``` #### 预防措施 1. 编辑器设置:为 `Makefile` 文件类型启用 **硬 TAB 模式** 2. 语法检查:运 `make -n` 或 `make --dry-run` 预检查语法 3. 版本控制:在 `.gitattributes` 中添加: ```git *.mk text eol=lf Makefile text eol=lf -indent-with-non-tab ``` > **关键原则**:Makefile 中规则命令(`gcc`、`rm` 等)**必须且只能**用 TAB 开头,变量赋值(`CFLAGS=...`)目标定义(`target:`)则无需 TAB[^2][^4]。 --- ### 相关问题 1. 如何在 VSCode 中为 Makefile 永久启用 TAB 缩进? 2. Makefile 中变量赋值规则命令的语法区别是什么? 3. 除了分隔符错误,Makefile 还有哪些常见错误?如何调试? 4. 如何用 `make --debug` 诊断 Makefile 执流程? [^1]: 引用自用户提供的 Makefile 错误示例,显示空格缩进导致的分隔符错误。 [^2]: 强调 Makefile 语法要求规则命令必须使用 TAB 而非空格。 [^3]: VSCode 的 TAB 设置方法参考自用户提供的解决方案链接。 [^4]: 修正示例基于用户提供的 Makefile 代码片段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值