You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求两个Shell单行命令:匹配/不匹配指定字符串时过滤输入

所需Shell单行命令实现

1. eatIfMatch 命令(匹配指定字符串则吃掉所有输入,否则输出)

可以用 sed 或 awk 实现,单行命令如下:

sed版本

sed -n '1h;1!H;${g;/'"$1"'/q;p}'

awk版本

awk -v pat="$1" '{lines[NR]=$0} $0 ~ pat {matched=1} END{if (!matched) for (i=1; i<=NR; i++) print lines[i]}'

逻辑说明:

  • sed版本:先把所有输入行缓存到保持空间,最后检查缓存内容是否匹配指定字符串。如果匹配则直接退出(不输出),否则输出全部缓存内容。
  • awk版本:将所有行存入数组,同时标记是否匹配到目标字符串。处理完所有行后,若未匹配则遍历数组输出全部内容。

2. eatIfNoMatch 命令(不匹配指定字符串则吃掉所有输入,否则输出)

同样提供sed和awk两种实现:

sed版本

sed -n '1h;1!H;${g;/'"$1"'/p;q}'

awk版本

awk -v pat="$1" '{lines[NR]=$0} $0 ~ pat {matched=1} END{if (matched) for (i=1; i<=NR; i++) print lines[i]}'

逻辑说明:

  • sed版本:缓存所有输入行后,检查缓存内容是否匹配指定字符串。如果匹配则输出缓存内容,否则直接退出(不输出)。
  • awk版本:和eatIfMatch逻辑类似,仅最后判断条件相反——只有匹配到目标字符串时,才输出所有缓存的行。

示例验证

用你给出的测试文件验证效果:

# 测试eatIfMatch
sed -n '1h;1!H;${g;/match/q;p}' < matchFile  # 无输出(匹配到"match")
sed -n '1h;1!H;${g;/match/q;p}' < noMatchFile  # 输出noMatchFile全部内容

# 测试eatIfNoMatch
sed -n '1h;1!H;${g;/match/p;q}' < matchFile  # 输出matchFile全部内容
sed -n '1h;1!H;${g;/match/p;q}' < noMatchFile  # 无输出(未匹配到"match")

内容的提问来源于stack exchange,提问作者Graham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:27:28