An verschiedenen Stellen im Internet habe ich gefunden:
\015
\012
\x0a - hex
\n
\r
alles als Synonyme für verschiedene Zeilenumbrüche / Wagenrückläufe ...
Aber in diesem kleinen Skript kann ich nicht erkennen, wann ich auf eine neue Zeile stoße - kann mir jemand sagen, worauf ich in der if-Zeile achten soll?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
cat | while read line; do ...; done
, wissen Sie, dass für jede Iteration ein Wagenrücklauf vorhanden war. Wenn Ihre Eingabe Dateien mit\r
ohne sein kann\n
, transformieren Sie die Datei einfach,tr '\r' '\n'
während Sie die Eingabe verarbeiten. Wenn Sie nur wissen müssen, ob mehrere Zeilen vorhanden sind :wc -l
.wc -l
wird 0 zurückgegeben. Sie sollten das als Antwort hinzufügenAntworten:
Wenn Sie Zeichenfolgen direkt unter einer
for
Schleife verwenden, funktioniert dies pro Wort (hier bei einem Wort: der gesamte Inhalt von,$test
da es in Anführungszeichen steht) und nicht pro Zeichen. Sie müssen einewhile
Schleife mitread
verwenden, um Buchstaben für Buchstaben zu analysieren oder um einen numerischen Parameter einzuführen, der über die Zeichenfolge iteriert.Darüber hinaus müssen Sie bei der Verwendung
read
sicherstellen, dass Zeilenumbrüche und Leerzeichen nicht als Trennzeichen interpretiert werden, undread
das Lesen von jeweils einem Zeichen erzwingen .Hier ist eine Arbeitsversion:
Sie könnten ersetzen
$'\n'
mit$'\012'
oder$'\x0a'
, da sie alle den gleichen Newline - Code darstellen. Aber es ist nicht dasselbe wie\015
oder\r
- dies steht für Wagenrücklauf (Rückkehr zum Zeilenanfang). Auf Linux-Systemen werden Zeilenumbrüche mit dargestellt\n
, unter Windows beispielsweise durch eine Folge von\r\n
. Wenn Sie eine Textdatei von Windows haben, können Sie daher Zeilenumbrüche auch durch Suchen erkennen\r
.quelle
\n
in ihre Bytedarstellung um, sodass Sie keine hässlich aussehenden, zitierten Zeilenumbrüche in Ihre Testanweisung einfügen müssen.Sie können sehr einfach in Bash nach Zeilenumbrüchen in einer Variablen suchen mit:
Ich finde es bequemer zu benutzen:
quelle
Ich würde vorschlagen, zu verwenden
tr
und danntest
:Das
tr -cd
entfernt alles außer den Zeilenumbrüchen / Wagenrückläufen. Wenn die Datei Zeilenumbrüche enthält, wird eine Ausgabe ausgegeben, von der der-n
Test true zurückgibt .quelle
\r
Dies funktioniert nicht für Dateien, die kein s enthalten, da durch das Ersetzen von Befehlen die nachfolgenden Zeilenumbrüche entfernt werden ("$(printf '\n\n\n\n\n')"
ist die leere Zeichenfolge).