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

Bash脚本中使用PCRE2处理标准输入与变量的问题排查

Bash脚本中使用PCRE2处理标准输入的相关问题

问题背景

尝试在Bash脚本中通过PCRE2匹配*标准输入(stdin)*传入的内容,查阅官方文档后无法确认该操作是否可行。目前已知PCRE2支持直接传入文件名作为匹配目标,但本次测试场景明确要求处理管道传入的标准输入内容,无法直接指定文件路径。

测试场景说明

  • 测试文件input.txt内容:
foo blah is a bar
this shouldn't work
  • 测试执行命令:
cat input.txt | sh program.sh "foo %{0} is a %{1S3}"
  • 被测脚本program.sh初始内容:
#!/bin/bash

# 授予Elixir模块执行权限
chmod +x ./lib/my_mod.ex

# 读取脚本传入的模式参数
token=$1

# 初始化数组存储标准输入读取到的每行内容
array=()
while IFS= read line; do
array+=("${line}")
done

# 根据传入的模式串生成对应PCRE正则表达式
regex=$(mix run -e "my_mod.main('${token}')")

# 直接指定文件调用pcre可正常运行
pcre "${regex}" ./input.txt

# 逐行遍历数组调用pcre2grep的逻辑(初始为注释状态)
# for value in "${array[@]}"
# do
#      echo "${value}"
#      pcre2grep "${regex}" "${value}"
# done

异常现象

测试中直接执行pcre "${regex}" ./input.txt可正常得到匹配结果,但取消逐行遍历调用pcre2grep的代码注释后,该段逻辑无法正常工作,异常代码段如下:

# 遍历每行内容调用pcre2grep做正则匹配
for value in "${array[@]}"
do
     echo "${value}"
     pcre2grep "${regex}" "${value}"
done

补充排查结论

后续测试发现:直接硬编码$(mix run -e "my_mod.main('${token}')")的返回值作为正则传入pcre2grep时,命令无法正常工作;但手动硬编码正则内容执行pcre2grep "foo [a-zA-Z ]{0,} is a \W*(\w+(\W+|$)){1,4}$"可正常匹配,初步怀疑Mix调用环节对正则传参存在影响,需要确认PCRE是否支持标准输入处理场景,以及该问题的根本原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:18:19