如何将含stdin传入正则的Perl查找命令设为Shell别名?
实现思路与解决方案
因为Shell别名无法灵活处理参数传递与标准输入,推荐用Shell函数来实现需求,以下是具体方案:
函数实现
find_define() { # 从标准输入读取正则表达式 read -r regex # 确定输出文件名,未传入则使用默认值ioctl_values.txt local output_file="${1:-ioctl_values.txt}" # 执行查找逻辑,用m{}作为Perl匹配分隔符避免/转义问题 sudo find /usr -type f | xargs perl -ne "print \"( \$ARGV ) Line \$.: \$_\" if \$_ =~ m{$regex}" 2>/dev/null | head -n 1 | xargs -0 echo >> "$output_file" & }
使用方法
指定正则与输出文件:
将需要匹配的正则通过管道传入函数,同时在函数后指定输出文件名:echo '#define\s*METHOD_NEITHER' | find_define IOCTL_INTERNAL_USB_CYCLE_PORT_Values.txt仅指定正则,用默认输出文件:
如果不传入输出文件名,默认会将结果追加到ioctl_values.txt:echo '#define\s*IOCTL_' | find_define后台运行:
命令末尾的&会让进程在后台执行,不阻塞当前终端会话。
持久化配置
如果希望每次打开Shell都能使用这个函数,将上述函数代码添加到你的Shell配置文件中:
- Bash用户:编辑
~/.bashrc - Zsh用户:编辑
~/.zshrc
添加后执行以下命令使配置生效:
source ~/.bashrc # Bash用户 # 或 source ~/.zshrc # Zsh用户
关键细节说明
- 使用
read -r读取正则:保留正则中的特殊字符(如反斜杠),避免Shell自动转义。 - Perl用
m{}作为匹配分隔符:无需转义正则中的/字符,适配更多场景。 - 局部变量
output_file:避免污染Shell全局变量环境。
内容的提问来源于stack exchange,提问作者Virtual Wizard
相关产品推荐
相关产品推荐

