Intereting Posts
Как обойти проблему «Истек срок действия файла» на локальном зеркале Что означает этот , начинающийся с многих строк во время экрана загрузки Linux? Получить bash DEBUG trap для выполнения только один раз для и / или списков? sed или awk для вставки вкладок (разделителей) в определенных положениях Загрузка с использованием initramfs вместо uramdisk Файловый дескриптор для чтения сообщений журнала ядра? Пересылка и маршрутизация iptables выйти из системы из-за обновления пакета обновления для google-chrome? Редактирование бинарных потоков, содержащих байты '\ x00' Firefox / Icecat: ошибка версии SQLite: приложение обновлено, но ваша версия SQLite слишком стар и приложение не может работать Как я могу установить dvsdk Texas Instruments? Почему система не реагирует, когда сетевая нагрузка составляет 90-95 Мбит / с? Ошибка соединения с POE предупреждение о потреблении памяти Синхронизация очень медленная. Ubuntu 10.10, 32 бит, ext4

Многократное перенаправление файлов с помощью awk и поиск

У меня есть несколько файлов в каталоге. И я хочу добавить некоторые строки вверху и концу файла, используя awk .

Пример: Моя команда awk :

 awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file 

Используя вышеприведенную команду, я могу добавить line1 и line2 в начало & line3 , line4 в конце file

Теперь я хочу сделать одно действие для всех файлов, существующих в текущем каталоге.

Если я использую:

 awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' * 

Затем я получаю вывод на экране терминала, но я не могу перенаправить (или перезаписать) все файлы .

Итак, я попробовал следующее ( find + awk ):

 find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' \; 

Используя вышеприведенную команду, я могу печатать выходные данные на экране и, следовательно, перезаписывать файлы ,

Я пробовал следовать (Чтобы find + awk + переписать с tee ), но он получает ошибку:

 $ find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' | tee '{}' \; find: missing argument to `-exec' 

Следовательно, как я могу использовать awk для перезаписи (т. |tee помощью |tee или что-то еще) для всех файлов в текущем каталоге по команде?

С GNU awk 4.1 или выше:

 find . -type f -exec awk ' @load "inplace" BEGINFILE { inplace_begin(FILENAME, "") print "line1\nline2" } {print} ENDFILE { print "line3\nline4" inplace_end(FILENAME, "") }' {} + 

Решение1 : используйте GNU sed вместо awk

 sed -i -e '1 i\line1\nline2' -e '$ a\line3\nline4' ./* 

Решение2 : используйте цикл для каждого файла в каталоге

 for file in ./* do awk ' BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" } ' "$file" > "$file".tmp && mv -f "$file".tmp "$file" done