Shell中调用变量存储的sed命令无输出是什么原因
问题原因
你遇到的无输出问题是两个shell语法误用共同导致的,和sed读取变量规则本身无关:
- 未给变量展开加双引号导致内容格式被破坏
shell解析不带双引号的$TABLES展开时,会自动执行单词拆分逻辑:变量内所有连续的空白字符(换行、空格、制表符)都会被识别为参数分隔符,原本存的4行文本会被拆成4个独立参数传给echo,echo默认用单个空格拼接所有参数,最终输出给sed的不是多行内容,而是一整行字符串:foobar test bar foo。 - sed规则匹配到整行内容触发删除
你定义的/bar/d;/foo/d;规则逻辑是:逐行检查,只要行内包含bar或foo子串就删除整行。前面被拼接成单行的内容里同时存在bar和foo,直接被sed整行删除,终端自然没有任何返回。
你手动替换sed规则测试时能得到预期结果,本质是测试时大概率下意识给$TABLES加了双引号(比如敲成了echo "$TABLES" | sed '/bar/d;/foo/d;'),echo输出了原始的多行内容,sed逐行处理后只保留不匹配规则的test行,和是否把规则存在变量里没有关系。另外sed表达式末尾的分号是合法语法,不会导致执行异常。
修复方案
所有变量展开时都用双引号包裹,避免shell自动做单词拆分、通配符展开等意料之外的处理,修正后的命令如下:
echo "$TABLES" | sed "$SKIP"
执行后会正常输出预期结果test。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

