求两个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
相关产品推荐
相关产品推荐

