
Мне интересно, как я могу проверить конец файла в цикле while. Что я здесь делаю, так это если есть какое-то слово, например, "pineapple", "apple", "onion", "orange" и т. д., я хочу найти строки, включающие определенные слова, с помощью команды grep и сделать какой-то комментарий "window". Например, если я использую grep 'a' 'file'
, то он найдет "pineapple", "apple" и "orange". Затем, наконец, я хочу, чтобы это было напечатано как "pineapple, window, apple, window, orange, window", что-то вроде этого. Поэтому я хотел бы сделать какое-то условие в цикле while или for. Любая помощь будет очень признательна.
редактировать: Примеры входных данных
apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion
Ожидаемые результаты при использовании команды grep -->grep 'a' 'file name'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
решение1
Использование awk
Чтобы напечатать window
после каждой совпадающей строки a
:
$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Как это работает
/a/{...}
выбирает строки, соответствующие регулярному выражению a
. Для каждой такой строки выполняются команды в фигурных скобках.
print
печатает строку, содержащую совпадение
print "window"
отпечатки window
.
Использование sed
$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Как это работает
-n
сообщает sed, что не следует печатать, пока мы явно не захотим этого.
/a/{...}
выбирает строки, соответствующие регулярному выражению a
. Для этих строк выполняются команды в фигурных скобках.
s/$/\nwindow/
добавляет новую строку window
после конца текущей строки.
p
отпечатки.
решение2
$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
При этом используется исходная grep
команда, а затем слово добавляется window
после каждой полученной строки с помощью a
команды («append») в GNU sed
(стандарт sed
требует новой строки после \
and в конце вставленного текста, но GNU sed
немного более снисходителен).
Альтернативный вариант — использование только GNU sed
:
$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Выражение sed
печатает каждую строку, содержащую букву a
, а затем добавляет строку window
.
решение3
Оболочку можно использовать следующим образом:
while IFS= read -r line || [ -n "$line" ]; do
case "$line" in
*a*) printf "%s\nwindow\n" "$line"
esac
done < input.txt
Он объединяет типичный while IFS= read -r line; do...done < file.txt
цикл для чтения файлов, case
оператор для сопоставления строк, содержащих определенный символ, и printf
для печати этой дополнительной window
строки.