linux - grep 上的 Tcl exec 返回 "grep: nothing to repeat",而正常的 LINUX 给出正确答案

标签 linux grep tcl exec csh

这是我使用 cshell 运行命令时发生的情况:

find /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code -name "*.tcl" | grep -v regression | xargs grep -Plc "^[ ]*namespace[ ]+eval[ ]+DlgViolationKeepProcs "
> /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code/DlgViolationKeepProcs.tcl

到目前为止,一切都很好。但是,看看当我尝试在 TCL 8.4 中执行相同操作时会发生什么:

exec find /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code -name "*.tcl" | grep -v regression | xargs grep -Plc "^[ ]*namespace[ ]+eval[ ]+DlgViolationKeepProcs "
> grep: nothing to repeat

为什么?有什么想法吗?
谢谢。

最佳答案

问题是双引号中的 [] 被处理为 Tcl 命令替换。特别是,[ ] 被替换为空字符串,即被删除!最简单的解决方法是将 grep 术语放在 {braces} 中以禁止替换,尽管在 前面放置一个反斜杠 (\) code>[ 也有效。

让我们通过使用一些策略变量让您的代码更易于阅读:

# Where to search from; often a nice thing to separate out
set basedir /projects/corpeng/members/ldagan/adm/utils/Synopsys/CCK/shared_tcl_code

# What to look for; note the braces!
set term {^[ ]*namespace[ ]+eval[ ]+DlgViolationKeepProcs }

exec find $basedir -name "*.tcl" | grep -v "regression" | xargs grep -Plc $term

如果你说:

set term "^\[ ]*namespace\[ ]+eval\[ ]+DlgViolationKeepProcs "

但是经验告诉我要尽量避免不必要地使用反斜杠;从长远来看,它们会更加困惑。

关于linux - grep 上的 Tcl exec 返回 "grep: nothing to repeat",而正常的 LINUX 给出正确答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39222713/

相关文章:

arrays - 重命名全局数组 TCL

linux - 瑞尔 5 : Unable to apply patch

python - SWIG 安装升压错误

Java 访问控制异常 : keeping getting File IO error when trying to write log file

bash - 使用 shell 脚本从日志中提取值

awk - 匹配特定列的 grep 文件

c++ - 从一个解释器中获取 tcl 命名空间的内容并传递给另一个解释器

ruby-on-rails - 将 Rails 服务器绑定(bind)到 Linux 上的端口 80,而不以 root 身份运行它

linux - grep 日志文件仅用于 X 个具有特殊值(value)的最新条目

Tcl/Tk 写入特定行