Bash中保留含web或batch+web的行,删除仅含batch的行
解决sed过滤仅含batch行的问题
我需要生成一个子模式,要求删除所有仅涉及batch的行,保留同时包含batch和web的行,以及仅包含web的行。但用以下命令处理后,仅含web的行也消失了,不符合预期:
sed -i -e '/batch/!b' -e '{/web/!d;}' $target_file
问题根源
原命令想通过/batch/!b跳过不含batch的行,只处理含batch的行——删除其中不含web的行。但因为sed的语法细节,导致仅web的行被意外处理并删除。核心需求其实是:删除所有包含batch但不包含web的行,其余行全部保留。
正确解决方案
方案1:修正后的sed命令
直接定位“含batch但不含web”的行进行删除,逻辑精准:
sed -i '/batch/ {/web/!d;}' "$target_file"
或者更简洁的写法:
sed -i '/batch/!b; /web/!d' "$target_file"
方案2:用awk实现(逻辑更直观)
awk的条件判断更易懂:保留“不含batch”或者“同时包含batch和web”的行:
awk '!/batch/ || /web/' "$target_file" > temp && mv temp "$target_file"
效果验证
用上述任一命令处理起始文件后,会得到预期输出:
- 仅含batch的行(比如
classDef batch fill:#050、22.6.90.01.0===22.6.90.02.0:::batch_conf_livré等)被删除 - 仅含web的行和同时包含batch&web的行全部保留
内容的提问来源于stack exchange,提问作者orgAMS
相关产品推荐
相关产品推荐

