Ist es möglich, einen Befehl für eine in einer Variablen gespeicherte Zeichenfolge auszuführen?

Ist es möglich, einen Befehl für eine in einer Variablen gespeicherte Zeichenfolge auszuführen?

Hallo, ich versuche gerade, den folgenden Code auszuführen. Ich habe in der Variable DATE eine Zeichenfolge im Format JJJJ/MM/TT gespeichert. Ich versuche, das Jahr mithilfe des Befehls „cut“ zu extrahieren. Ich erhalte eine Fehlermeldung, die besagt, dass es sich nicht um eine Datei oder ein Verzeichnis handelt. Kann ich eine Änderung vornehmen oder gibt es eine andere Möglichkeit, dies zu tun?

for file in ~/filesToSort/*
do

   DATE=$(head -1 $file | tr "-" "/")
   echo "${DATE}"
   YYYY=$(cut -c1-4 accounts $DATE)
   #echo "${YYYY}"
done

Danke

Antwort1

Das cutDienstprogramm liest Daten aus seinem Standardeingabestream und verarbeitet keine als Argumente angegebenen Zeichenfolgen.

Um zu verwenden cut, müssen Sie die Daten daher über die Standardeingabe übergeben:

YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )

Dies wäre jedoch in einer Schleife sehr langsam. Verwenden Sie stattdessen eine integrierte Parameterersetzung, um alles nach dem ersten /in der $DATEZeichenfolge zu löschen:

YYYY=${DATE%%/*}

Dadurch wird die längste Suffixzeichenfolge entfernt $DATE, die dem Shell-Muster entspricht /*. Wenn die Zeichenfolge ist 2021/10/21, wird zurückgegeben 2021.

Um die ersten vier Zeichen jeder Datei in einem Verzeichnis zu erhalten (was im Wesentlichen das ist, was ichglaubenIhr aktueller Code versucht dies zu tun), könnten Sie sedFolgendes verwenden:

for name in "$HOME"/filesToSort/*; do
    sed -e 's/\(....\).*/\1/' -e q "$name"
done

Dies liest die erste Zeile jeder Datei ein, ersetzt den Inhalt der Zeile durch die ersten vier Zeichen der Zeile und beendet den Vorgang, nachdem das Ergebnis an das Terminal ausgegeben wurde.

Antwort2

Wenn Ihre Shell dies unterstützt, können Sie <<<hierfür Here Strings ( ) verwenden. Von man bash:

Here Strings
       A variant of here documents, the format is:

              [n]<<<word

       The word undergoes tilde expansion, parameter and variable  expansion,
       command  substitution, arithmetic expansion, and quote removal.  Path‐
       name expansion and word splitting are not performed.   The  result  is
       supplied  as  a single string, with a newline appended, to the command
       on its standard input (or file descriptor n if n is specified).

In Ihrem Fall würden Sie Folgendes tun:

for file in ~/filesToSort/*
do

   date=$(head -1 "$file" | tr "-" "/")
   echo "${DATE}"
   yyy=$(cut -c1-4 <<< "$date")
   echo "$yyy"
done

Antwort3

Noch eine andere Möglichkeit, das gute alteawk

for file in *; do
    awk -F'-' 'NR==1 {print $1}' $file
done
  • -F '-'-weist awk an , als Trennzeichen das zu verwenden
  • NR==1Sagen Sie awk, dass nur die erste Zeile jeder Datei gelesen werden soll
  • {print $1}Drucken Sie nur das erste Feld, getrennt durch das Trennzeichen

verwandte Informationen