Ich lese eine Datei Zeile für Zeile, bearbeite jede Zeile und speichere diese Zeilen in einer separaten Datei.
while read -r line
do
newline=$(echo $line | sed -r 's/\</\n/g' | sort | tr '\n' ' ')
echo "$newline" >> newfile
done < "$filename"
Ich möchte jedoch die Originalzeilen durch die neuen Zeilen ersetzen . Ich habe gelesen, dass ich oder $filename
verwenden könnte, aber bisher sind meine Versuche fehlgeschlagen.cat filename... | xargs -n1 command
sed -i ...
Hier ist eine Beispieleingabe:
1.e4 e5 2.Nf3 Nc6 3.
1.d4 d5 2.e4 dxe4 3.
1.e4 e5 2.Nf3 Nf6 3.
und dies ist die erwartete Ausgabe:
1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6
Antwort1
Sie können sponge
, wie inEin Programm, das die Standardeingabe oder eine Datei puffern könnteSie können die gesamte Schleife dorthin weiterleiten, genauso wie die Eingabe dorthin umgeleitet wird:
while read -r line ; do
echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ;
echo
done < filename | sponge filename
Mit Perl könnte man das Gleiche hiermit machen (die Menge der Leerzeichen ist anders):
perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename
Antwort2
awkAnsatz:
awk 'BEGIN{IGNORECASE=1;}{ gsub(/\./,". ", $0); split($0, w, " ");
asort(w);l=""; for(i in w) {l=l" "w[i]} print l}' file
Die Ausgabe:
1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6
FALL IGNORIERENkann auf der Kommandozeile oder in einemBEGINNENRegel
split($0, w, " ");
- teilt die Zeile in einzelne Wörter auf
asort(w);
- sortiert Array-Werte (Wörter)
for(i in w) {l=l" "w[i]}
- Verketten sortierter Wörter zu einer einzigen Zeile