如何从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
答案 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))