
Ich frage mich, wie ich das Ende der Datei in einer while-Schleife prüfen kann. Was ich hier mache, ist, wenn es ein Wort wie „Ananas“, „Apfel“, „Zwiebel“, „Orange“ usw. gibt, möchte ich Zeilen mit bestimmten Wörtern finden, indem ich den Befehl grep verwende und den Kommentar „Fenster“ hinzufüge. Wenn ich beispielsweise verwende grep 'a' 'file'
, werden „Ananas“, „Apfel“ und „Orange“ gefunden. Dann möchte ich es schließlich als „Ananas, Fenster, Apfel, Fenster, Orange, Fenster“ oder so etwas ausgeben. Also möchte ich eine Bedingung in einer while- oder for-Schleife erstellen. Jede Hilfe ist sehr willkommen.
bearbeiten: Beispieleingaben
apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion
Erwartete Ausgaben bei Verwendung des Grep-Befehls -->grep 'a' 'file name'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Antwort1
Verwenden von awk
So drucken Sie window
nach jeder übereinstimmenden Zeile a
:
$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Wie es funktioniert
/a/{...}
wählt Zeilen aus, die dem regulären Ausdruck entsprechen a
. Für jede solche Zeile werden die Befehle in geschweiften Klammern ausgeführt.
print
druckt die Zeile mit der Übereinstimmung
print "window"
druckt window
.
Verwenden von sed
$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Wie es funktioniert
-n
weist sed an, nicht zu drucken, es sei denn, wir fordern es ausdrücklich auf.
/a/{...}
wählt Zeilen aus, die dem regulären Ausdruck entsprechen a
. Für diese Zeilen werden die Befehle in geschweiften Klammern ausgeführt.
s/$/\nwindow/
fügt eine neue Zeile window
nach dem Ende der aktuellen Zeile hinzu.
p
druckt.
Antwort2
$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Dies verwendet Ihren ursprünglichen grep
Befehl und hängt dann das Wort window
nach jeder resultierenden Zeile mit dem a
Befehl („append“) in GNU an sed
(standardmäßig sed
ist eine neue Zeile nach dem „ \
und“ am Ende des eingefügten Textes erforderlich, aber GNU sed
ist etwas nachsichtiger).
Alternativ können Sie nur GNU verwenden sed
:
$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Der sed
Ausdruck druckt jede Zeile, die den Buchstaben enthält, a
und hängt dann die Zeichenfolge an window
.
Antwort3
Die Shell-Methode kann folgendermaßen verwendet werden:
while IFS= read -r line || [ -n "$line" ]; do
case "$line" in
*a*) printf "%s\nwindow\n" "$line"
esac
done < input.txt
Dies kombiniert die typische while IFS= read -r line; do...done < file.txt
Schleife zum Lesen von Dateien, case
Anweisungen zum Abgleichen von Zeilen, die bestimmte Zeichen enthalten, und printf
zum Drucken dieser zusätzlichen window
Zeile.