在grep中使用tab符号

今天需要搜索一个字符串%BD%A3%CF%C9,并且字符串的左侧和右侧都是tab符号,后来查询到用-P选项就行了。

hdfs dfs -text /user/webrank/luliujie/alpha/20150104/part-r-* | grep -P '\t'%BD%A3%CF%C9'\t' | more

而且grep还支持正则表达式。可以直接用^和$符号。

<think> 在Makefile中,缩进规则是严格的,因为制表符(tab)被用作命令的标识符。Makefile的语法要求: 1. 规则的目标和依赖行不能以tab开头(除非是续行) 2. 规则的命令必须以tab开头 3. 条件指令(如ifeq, ifdef等)在Makefile中属于语法部分,不是命令,因此不能以tab开头。 用户的问题涉及到两个不同的上下文: 1. `$`符号前面不能有tab:这是因为`$`通常用于变量引用(如`$(var)`)或函数调用,它们出现在赋值或条件表达式中,而这些行不属于命令,因此不能以tab开头。如果以tab开头,make会将其解释为命令,导致语法错误。 2. `ifeq`前面可以使用tab:实际上,这是不正确的。条件指令(如`ifeq`)也不能以tab开头,因为它们属于Makefile的语法结构,而不是命令。 引用[1]和引用[4]中的示例展示了条件指令的用法,注意条件指令(如`ifeq`)都是顶格写的,没有缩进。例如: ```makefile .PHONY: test var1 := A var2 := $(var1) var3 := test: ifeq ($(var1),$(var2)) @echo "var1 == var2" else @echo "var1 != var2" endif ``` 在这个例子中,`ifeq`、`else`和`endif`都是顶格写的,而规则内的命令(如`@echo`)以tab开头。 然而,在引用[2]中,条件指令被缩进了,但这实际上是一个错误,因为条件指令不能出现在命令部分。在引用[2]的例子中,条件指令被错误地放在了规则内部(即`test`目标之后),并且缩进了,这会导致make将其解释为命令(因为以tab开头的行都被视为命令),从而出现语法错误。 所以,正确结论是: - 条件指令(如`ifeq`)必须顶格写,不能以tab开头。 - 命令(以`$`开头的行通常不是命令,但命令中也可能包含`$`(如变量引用),但整个命令行必须以tab开头。 因此,用户提到的“ifeq前可以使用tab”实际上是错误的做法。可能用户看到了某些示例中条件指令被缩进,但那是错误的,会导致make解析失败。 具体到用户的问题,为什么“$前面不能使用tab”? - 因为`$`用于变量引用或函数调用,它们通常出现在非命令的上下文中(如赋值、条件表达式),这些行不能以tab开头。如果以tab开头,make会将其视为命令,但该行并不是有效的shell命令,因此会报错。 例如: ```makefile # 正确 var := $(shell command) # 错误(因为以tab开头) var := $(shell command) # 这行以tab开头,make会试图将其作为命令执行,但该行又不是任何目标的命令,因此会报错 ``` 而在规则内的命令中,可以使用`$`(例如变量引用),但整个命令行必须以tab开头: ```makefile target: @echo $(VAR) # 整个命令行以tab开头,其中的$(VAR)会被展开 ``` 总结: 1. Makefile的语法部分(变量赋值、条件指令、包含指令等)必须顶格写,不能以tab开头。 2. 规则内的命令必须以tab开头。 因此,用户观察到的现象是: - `$`出现在变量引用时,所在行不能有tab(因为属于语法部分) - 条件指令(如`ifeq`)也不能有tab,必须顶格写 用户可能误解了某些示例,将条件指令写在了规则内部并缩进,这是错误的。 根据引用[1]和[4]中的示例,条件指令都是顶格写的,没有缩进。而引用[2]中的条件指令缩进是错误的,会导致错误。 因此,正确做法是: - 条件指令放在规则外部(全局)或者规则内部但必须使用条件指令的语法(即条件指令必须顶格,即使它们在规则内部,也是作为全局条件,而不是规则的一部分)。 实际上,条件指令可以出现在规则内部,但必须顶格写,并且Makefile会将其视为在解析Makefile时即进行求值。例如: ```makefile target: ifeq ($(VAR), value) command1 else command2 endif ``` 注意,这里的`ifeq`、`else`、`endif`都是顶格写的,而命令(`command1`和`command2`)以tab开头。 如果将它们缩进(即前面加tab),那么make会将这些行视为命令,并传递给shell,而shell不认识`ifeq`,从而导致错误。 所以,用户的问题应该是:为什么在Makefile中,条件指令(如`ifeq`)和变量赋值等行不能以tab开头,而规则中的命令必须以tab开头? 答案:这是Makefile的语法规定。缩进(tab)是Makefile用来区分命令和其他语法元素的唯一方式。 引用参考文献: - 引用[1]和[4]中的条件指令都是顶格写的,没有缩进。[^1][^4] - 引用[2]中的条件指令缩进了,这是错误的,但注释掉了错误行。[^2] 因此,用户应遵循:所有非命令的语法元素(包括条件指令)都顶格写,命令必须以tab开头。 </think> 在 Makefile 中,**缩进规则存在关键差异**,这解释了为什么 `ifeq` 前可以使用 tab 而 `$` 前不能使用 tab。根本原因在于 Makefile 的语法解析机制: ### 核心差异解析 1. **`ifeq` 的条件指令**: - 属于 **Makefile 语法结构**,不是 Shell 命令 - 在 Makefile **解析阶段**就被处理(早于命令执行) - 必须**顶格书写**(不能有缩进),如引用[4]所示: ```makefile ifeq ($(var1),$(var2)) # ← 顶格无缩进 @echo "var1 == var2" # ← 命令前有tab endif ``` [^4] 2. **`$` 开头的变量/函数**: - 当出现在**命令区域**时(如规则下的命令列表) - 必须以 **tab 开头**,因为 tab 标识该行是 Shell 命令 - 如引用[1]中的命令: ```makefile test: @echo "$(var1)" # ← 整行以tab开头 ``` [^1] ### 根本原因:Makefile 的两阶段处理 | 阶段 | 处理内容 | 缩进要求 | 示例 | |--------------------|----------------------------|-----------------|--------------------------| | **解析阶段** | 变量赋值、条件指令(ifeq)等 | 禁止缩进(顶格) | `ifeq (...)`, `var := value` | | **执行阶段** | Shell 命令 | 必须 tab 缩进 | `@echo $(var)`, `grep ...` | ### 错误示例分析 当 `ifeq` 前错误添加 tab 时(如引用[2]): ```makefile target: ifeq ($(BUILD_MODE),debug) # ← 错误!ifeq不应缩进 CFLAGS += -g # ← 此行也会被当做Shell命令 endif ``` 会导致: 1. `ifeq` 被当作 Shell 命令执行(但 Shell 无此命令) 2. 报错:`ifeq: command not found` 3. 条件逻辑完全失效 [^2] ### 正确写法对比 ```makefile # ✅ 正确:条件指令顶格 ifeq ($(OS),Linux) # ✅ 正确:命令区域使用tab缩进 @echo "Linux system: $(shell uname -r)" else @echo "Non-Linux system" endif # ❌ 危险:$开头的函数在非命令区域 var := $(shell date) # ✅ 允许:赋值语句中可用$ target: # ❌ 错误:$()在命令区域但未缩进 echo $(var) # 将报错 "missing separator" # ✅ 正确:整行命令用tab缩进 @echo "$(var)" ``` ### 根本原理 Makefile 用 **tab 字符作为命令区域的唯一标识符**: 1. 顶格行:Make 语法元素(ifeq/赋值等) 2. Tab 缩进行:Shell 命令(其中可包含 `$()`) 3. 空格缩进:会被忽略(不同于 tab) > ⚠️ 关键区别:**tab 是特殊控制字符**,而空格只是普通空白符。Make 仅通过 **0x09 (tab) 识别命令起始** [^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值