Полагаю, «awk» - это один из инструментов для работы, хотя я думаю, что «sed» проще для этой конкретной операции. Спецификация немного расплывчата. Простая версия:
- Найти первую строку, содержащую данное слово.
- Удалить эту строку и все последующие строки.
Для этого я бы использовал 'sed':
sed '/word/,$d' file
Более сложная версия:
- Найти первую строку, содержащую данное слово.
- Удалить текст в этой строке, начиная со слова.
- Удалить все последующие строки текста.
Возможно, я бы все еще использовал 'sed':
sed -n '1,/word/{s/word.*//;p}' file
Это инвертирует логику. По умолчанию он ничего не печатает, но для строк 1 до первой строки, содержащей слово, он подставляет (что ничего не делает до строки, содержащей слово), а затем печатает.
Можно ли это сделать в 'awk'? Не совсем тривиально, потому что «awk» автоматически разбивает входные строки на слова, и потому что вы должны использовать функции для подстановок.
awk '/word/ { if (found == 0) {
# First line with word
sub("word.*", "")
print $0;
found = 1
}
}
{ if (found == 0) print $0; }' file
( Отредактировано : изменить «удалить» на «найдено», так как «удалить» является зарезервированным словом в «awk».)
Во всех этих примерах усеченная версия входного файла записывается в стандартный вывод. Чтобы изменить файл на месте, вам нужно либо использовать Perl или Python, либо подобный язык, либо вы записываете вывод во временный файл, который вы копируете поверх оригинала после выполнения команды. (Если вы попробуете «файл сценария», вы обработаете пустой файл.)
Существуют различные ранние оптимизации выхода, которые можно применить к сценариям sed и awk, например:
sed '/word/q' file
И, если вы предполагаете использовать GNU-версии awk или sed, существуют различные нестандартные расширения, которые могут помочь с модификацией файла на месте.