在Bash脚本中,如何删除变量A中未在变量B出现的行?
Bash脚本中过滤变量内容的实现方案
完全可行,以下是两种简单的实现方式:
方法一:利用grep的批量匹配功能
直接通过grep的参数组合,一次性完成过滤:
# 定义示例变量 A=$'one\ntwo\nthree' B=$'one day\nthree weeks' # 执行过滤,保留A中未在B任意行出现的行 filtered_result=$(grep -v -F -f <(echo "$B") <<< "$A") # 输出结果 echo "$filtered_result"
参数说明:
-v:反向匹配,输出所有不匹配的行-F:将匹配模式当作固定字符串处理,避免正则表达式特殊字符引发问题-f <(echo "$B"):从变量B的内容中读取每一行作为匹配规则
方法二:逐行遍历检查
通过循环遍历变量A的每一行,逐一判断是否存在于变量B中:
# 定义示例变量 A=$'one\ntwo\nthree' B=$'one day\nthree weeks' filtered_result="" # 遍历A的每一行 while IFS= read -r line; do # 检查当前行是否未在B中出现 if ! grep -q -F "$line" <<< "$B"; then filtered_result+="$line"$'\n' fi done <<< "$A" # 移除末尾多余的换行符 filtered_result=${filtered_result%$'\n'} # 输出结果 echo "$filtered_result"
关键细节:
IFS= read -r line:确保正确读取包含空格、首尾空格的行,避免内容被截断grep -q:静默执行,仅返回匹配状态,不输出冗余内容
两种方法运行后都会输出预期结果:two
内容的提问来源于stack exchange,提问作者Néstor Boscán
相关产品推荐
相关产品推荐

