Bash mit grep und sed

Bash mit grep und sed

Dies ist für unsere wöchentliche Übung, keine Benotung oder Bewertung (wir bekommen nicht einmal die Antworten!)

Ich wäre wirklich dankbar, wenn jemand Zeit hätte, mir diese Übung zu erklären, da ich versuche, diese Arbeit übers Wochenende zu erledigen und erst nächste Woche Hilfe von meinem Tutor bekommen kann. Ich habe viel gelesen und gearbeitet, was Bash-Programmierung, Regex und Grep betrifft. Aber der folgende Code hat mich einfach nur verwirrt.

Ich frage mich sogar, ob die Anleitung unvollständig ist oder ob ich es einfach nicht verstehe?

Im Einzelnen sind es folgende, die mich daran hindern, das Ganze zu verstehen:

NAMES=`ls *.$1`

filed=$(file:$1).$2

Übung 4.3
Angenommen, Sie erhalten eine Textdatei (mit dem Namen myfile) mit dem folgenden Inhalt

#!/bin/bash

NAMES=`ls *.$1`

for file in $NAMES; do
    filed=$(file%:$1).$2
    mv file filed
done

Führen Sie die folgenden Befehle aus: $ grep ' file ' myfile

 $ grep 'file*' myfile

 $ grep '^ *file*' myfile

 $ grep 'file$' myfile

 $ sed 's/ file* / script /g' myfile

 $ sed ' /for/,/files/d' myfile

 $ sed '/\$[A-Z]..[A-Z]*/d' myfile

Erklären Sie dann die Ausgabe bzw. die Ergebnisse

Antwort1

NAMES=`ls *.$1`

Dies ist eine Zuweisung. Der Variablen $NAMESwird ein Wert zugewiesen. Der Wert wird als Ausgabe des Befehls in Backquotes übernommen (siehe Befehlsersetzung in man bash). $1ist ein spezieller Parameter, er entspricht dem ersten Argument des Skripts. Daher scheint das Skript mit einer Erweiterung als Parameter ausgeführt werden zu müssen (z. B. ./script.sh txt), die Ausgabe des lsBefehls wird in der Variablen gespeichert.

filed=$(file%:$1).$2

Das ist wirklich seltsam. Sind Sie sicher, dass die Klammern nicht tatsächlich geschweifte Klammern waren? Außerdem sollte ein .statt dem stehen :.

filed=${file%.$1}.$2

${var%pattern}schneidet das Muster vom Ende der Variablen ab. Weitere Einzelheiten finden Sie unter Parametererweiterung man bash. In diesem Fall werden also der Punkt und die durch den ersten Parameter angegebene Erweiterung entfernt und ein Punkt und der zweite Parameter hinzugefügt.

Übrigens sollte die Bewegungslinie wahrscheinlich sein

mv $file $filed

andernfalls gäbe es keinen Grund, eine Schleife zu verwenden.

verwandte Informationen