2 Stimmen

Foreach: grep backtick im for-loop

Wie könnte man Backticks aus Dateien in einer for-Schleife mittels grep extrahieren.

Ich möchte grep für das Muster '`define' ausführen. Das Muster funktioniert im eigenständigen grep-Befehl, scheitert jedoch in der for-Schleife.

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

Die Backticks sind in der for-Schleife konfliktträchtig.

Grüße

Srisurya

2voto

jm666 Punkte 58205

Einfach, verwenden Sie nicht ' und escapen Sie den Backtick mit einem Backslash.

Also, das nächste funktioniert nicht:

grep -r '`def' *

und gibt aus

Kein passender Befehl

Aber das:

grep -r \`def *

funktioniert und gibt aus

ewdwedwe `define`

Also, ähnlich für Ihr Skript funktioniert das nächste (Datei btick.tcsh):

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

und erzeugt das folgende Ergebnis

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

der Inhalt der btick.txt Dateien:

btick1 `def`

0voto

user1495523 Punkte 465

Dies ist eine alternative Lösung.

Verwendung des ASCII-Codes für das grep-Argument

 grep -rP '\x60define' $idirectory 

wobei \x60 der ASCII-Code für "`" ist

-1voto

Jotne Punkte 39246

Sie sollten keine alten und veralteten Backticks verwenden, sondern Klammern wie diese $(code)
Versuchen Sie dies:

für xxx in $(einiger code $(etwas mehr code)
   echo "$xxx"
erledigt

Verschachtelung und Backticks machen es kompliziert, es muss maskiert werden. Vergleichen Sie dies mit:

listing=`ls -l \`cat filenames.txt\``

vs

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X