Лучшим инструментом для неинтерактивного редактирования файлов на месте является например
.
ex -sc '%s/\(\.com\).*/\1/ | x' file.txt
Если вы использовали vi
и когда-либо вводили команду, начинающуюся с двоеточия :
, вы использовали команду ex. Конечно, многие из более сложных или «причудливых» команд, которые вы можете выполнить таким образом, являются расширениями Vim (например, : bufdo
) и не определены в спецификациях POSIX для ex
, но эти спецификации обеспечивают поистине удивительную степень мощности и гибкости при невизуальном редактировании текста (интерактивном или автоматическом).
Приведенная выше команда состоит из нескольких частей.
-s
включает тихий режим для подготовки ex
к пакетному использованию. (Подавить выходные сообщения и т. Д.)
-c
указывает команду для выполнения после открытия файла ( file.txt
в данном случае) в буфере.
%
- спецификатор адреса, эквивалентный 1, $
- это означает, что следующая команда применяется ко всем строкам буфера.
s
- это замещающая команда, с которой вы, вероятно, уже знакомы. Он обычно используется в vi
и имеет по существу идентичные функции с командой s
из sed
, хотя некоторые из расширенных функций регулярных выражений могут различаться в зависимости от реализации. В этом случае от ".com" до конца строки заменяется просто ".com".
Вертикальная черта разделяет последовательные выполняемые команды.Во многих (большинстве) реализаций ex
вы также можете использовать дополнительную опцию -c
, например:
ex -sc '%s/\(\.com\).*/\1/' -c x file.txt
Однако POSIX этого не требует.
Команда x
завершается после записи любых изменений в файл. В отличие от wq
, что означает «запись и выход», x
записывает в файл только в том случае, если буфер был отредактирован. Таким образом, если ваш файл не был изменен, метка времени будет сохранена.
Поскольку это слишком велико, чтобы поместить его в комментарий, вы пытались проверить, открыты ли еще какие-либо файлы в каталоге ~/PDF
во время их буферизации с помощьюlsof
(LiSt Open Files )?
Добавьте этот фрагмент кода послеenscript -B -P PDF bloom.c
:
# Go into endless loop and break when all files in */PDF/* are closed.
while :
do
if ! [[ `lsof | grep /PDF/` ]]
then
break
fi
sleep 1
done
и до
mv "`ls -dtr1 ~/PDF/* | tail -1`"
Так вы потеряете всего 1 секунду...
Подробнее:
lsof
выведет список всех открытых файлов man lsof
даст вам еще больше деталей. ;-)