为何grep -v $b <<< $a有输出,grep -v $a <<< $b却无输出?
问题根源
变量$b中的路径包含空格,直接执行grep -v $a <<< $b时,Shell会把$b里的空格当成字段分隔符,将完整路径拆成多个独立参数传给grep,导致grep无法识别完整行作为匹配目标,因此没有输出。而$a里的路径无空格,展开后不会被拆分,所以grep -v $b <<< $a能正常工作。
解决方案
要让grep正确处理带空格的多行变量,必须保证变量被整体传递,且让grep把每一行作为独立匹配模式,以下是两种可行方法:
方法1:用-f选项结合进程替换
借助grep -f从标准输入读取匹配模式,同时用双引号包裹变量保留换行和空格:
grep -v -f <(echo "$a") <<< "$b"
执行后会得到预期输出:
./new file name ./new file name/new file name.mkv ./new file name/new file name.nfo
方法2:写入临时文件后读取
如果系统不支持进程替换,可先把变量内容写入临时文件再读取:
echo "$a" > temp_a.txt grep -v -f temp_a.txt <<< "$b" rm temp_a.txt
通用兼容写法
为了让两个方向的对比都能正确处理空格,建议统一用-f选项:
# 从a中过滤掉b包含的行 grep -v -f <(echo "$b") <<< "$a" # 从b中过滤掉a包含的行 grep -v -f <(echo "$a") <<< "$b"
关键说明
- 必须用双引号包裹变量(如
"$a"、"$b"),这样Shell才会保留变量里的换行符和空格,不会拆分内容。 -f选项用于告诉grep从指定文件(这里是进程替换生成的临时文件)读取匹配模式,每一行对应一个独立模式。
内容的提问来源于stack exchange,提问作者user3552021
相关产品推荐
相关产品推荐

