我正在尝试简化我的Bash 4脚本.我正在读取文件中的行,我想排除与某些子字符串匹配的行:
while read p; do
if [[ $p != *-ext ]]; then
if [[ $p != *-backend ]]; then
if [[ $p != *-vip ]]; then
echo $p
fi
fi
fi
fi
done < $hostsfile
Run Code Online (Sandbox Code Playgroud)
因此,如果该行不以-ext或-backend或-vip结尾,则打印它.什么是一种更简单的方法(单行程不链接&&'s)来实现这一目标?
使用扩展模式.这需要在extglob选项中启用,但这是(暂时)默认情况下启用了的RHS !=内部操作者[[在bash4.2或更高版本.
shopt -s extglob # if necessary
if [[ $p != *-@(backend|vip|ext) ]]; then
Run Code Online (Sandbox Code Playgroud)
使用正则表达式的等价物将是
if ! [[ $p =~ (backend|vip|ext)$ ]]; then
Run Code Online (Sandbox Code Playgroud)
没有其他选项需要设置的,但正则表达式是不是隐含锚,所以你并不需要匹配类的字符串的开头*-做的模式,但你也需要将字符串的结尾明确匹配$.此外,没有不匹配的正则表达式运算符(如!~在Perl中),因此您需要使用=~和否定命令的退出状态.
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |