sed示例字符移除原因解析:最后一例为何删除字符'a'?
解析sed移除字符的原因,尤其是最后一例的'a'消失问题
咱们先把变量赋值和命令展开后的真实逻辑拆解开,就能把问题说透了。
第一步:变量的实际值
先看最开始的变量赋值:
a=a b=ab c='' d=''
这行给四个shell变量明确了值:
a="a"(普通字符串)b="ab"(普通字符串)c= 空字符串(长度为0,没有任何字符)d= 空字符串(和c一样)
第二个命令:移除'a'的核心原因
重点看你提到的最后一例命令:
echo ac | sed "s/$a/$b/; s/$c/$d/" bc
shell会先把双引号里的变量替换成实际值,替换后的sed命令其实是:
echo ac | sed "s/a/ab/; s///" bc
这里的s///是关键——sed里如果搜索模式为空(两个斜杠中间啥都没有),会自动复用上一次成功执行的替换命令里的搜索正则。
那处理管道输入ac的完整流程是:
- 第一个替换
s/a/ab/:把ac里的a换成ab,得到结果abc - 第二个替换
s///:因为上一次的搜索模式是a,所以这个命令等价于s/a//——也就是把当前行里的a替换成空字符串,直接移除。于是abc就变成了bc
这就是为什么最后会看到字符a被移除的原因。
补充:第一个命令的小细节
第一个命令:
echo ac | sed "s/$a/$b/;" abc
替换后是sed "s/a/ab/;" abc,这里的abc是sed要处理的文件名(如果这个文件存在的话)。sed会先处理管道输入的ac(把它变成abc输出),再处理abc文件里的每一行内容,执行同样的替换。这个命令本身不会移除字符,只是做了常规的字符串替换。
内容的提问来源于stack exchange,提问作者Akhmad
相关产品推荐
相关产品推荐

