foreach:grep在for循环中的反引号

时间:2014-07-09 05:39:18

标签: shell foreach grep csh backticks

如何从for循环中的文件中重写gret。

我想为模式'`define'运行grep。该模式在独立的grep命令中工作,但在for循环中失败。

foreach xxx ( `grep -r '`define' $idirectory --no-filename | sed -e 's ; //.* ; ; ' -e 's ; #.* ; ; ' -e 's ; ^\s* ; ; ' | grep -v ^$ | sort -n | awk '{print $2}' | uniq -d`)
  echo $xxx
end

反对在for循环中是冲突的。

问候

Srisurya

3 个答案:

答案 0 :(得分:2)

简单地说,不要使用'并使用反冲功能转义反引号。

所以,下一个没有用:

grep -r '`def' *

并打印

No matching command

但是这个:

grep -r \`def *

工作和打印

ewdwedwe `define`

因此,对于您的脚本,下一步工作(文件btick.tcsh):

#!/bin/tcsh
set greparg = \`def
foreach xxx ( `grep -l $greparg *` )
    echo ===$xxx===
end

并制作下一个结果

===btick.tcsh===
===btick1.txt===
===btick2.txt===

btick.txt文件的内容:

btick1 `def`

答案 1 :(得分:0)

这是另一种解决方案。

使用ASCII代码进行grep参数

 grep -rP '\x60define' $idirectory 

其中\ x60是"`"

的ascii代码

答案 2 :(得分:-1)

你不应该使用旧的和过时的后退,使用像$(code)这样的括号 试试这个:

for xxx in $(some code $(som more code)
   echo "$xxx"
done

嵌套和返回抽搐会使其变得复杂,需要进行转义。将其与:

进行比较
listing=`ls -l \`cat filenames.txt\``

VS

listing=$(ls -l $(cat filenames.txt))