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/

相关文章:

java - 在两台相连的计算机之间发送数据包的最快方法?

python - 将python中的键盘输入捕获为Linux中的守护进程

linux - Sed 语句不工作 Linux Raspbian

linux - 查找空文件,如果找到更新文件

linux - 流重定向顺序和操作系统执行的详细信息

linux - zgrep 在日志中搜索模式

bash - Grep 仅在匹配后打印

command - 如何收集tcl中man命令的输出?

regex - 限制 regsub 命令的数量以删除列表中的空格、行尾或回车符

tcl - 跨平台移动到垃圾箱