
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 cut
Dienstprogramm 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 $DATE
Zeichenfolge 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 sed
Folgendes 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 verwendenNR==1
Sagen Sie awk, dass nur die erste Zeile jeder Datei gelesen werden soll{print $1}
Drucken Sie nur das erste Feld, getrennt durch das Trennzeichen