Движение признаками, о которых Вы сообщаете, это идет вне поврежденного PATH
: это не влияло бы /usr/bin/env
. Однако трудно быть уверенным, потому что Ваше создание отчетов непоследовательно. Вы писали /usr/bin/env
или usr/bin/env
?
Удостоверьтесь, что существуют только символы ASCII в Вашем crontab, никаких небьющихся пробелах или непечатаемых символах. Кроме того, проверьте, что Вы не определили некоторые переменные среды, которые могут доставлять неприятности, такой как PATH
или LD_LIBRARY_PATH
.
Если /usr/bin/env: No such file or directory
убедительно предполагает, что существует неверная конфигурация на сервере, который Вы не можете починить. Виртуальная среда или концепция безопасности на сервере не позволяют Вам командам выполнения, по крайней мере, от крона. Невозможно знать то, что могло быть неправильным, не зная, какую среду сервер выполняет. Это - что-то, что должен зафиксировать системный администратор.
setlocale
ошибка не является причиной проблемы, но может быть другим признаком.
И встроенный скрипт vi
:
$ vi test.txt -c '%s/boy/Boy/g | %s/girl/Girl/g | g/^$/d | wq'
sed
- это инструмент для вас. Большинство команд, которые вы будете использовать в vi
, будут доступны в sed
, поэтому обучение не требует особого труда. Команды в vi
, которые запускаются с :
, основаны на основном редакторе ed
, и они также доступны в sed
. Вы будете использовать эти команды без :
, и они по умолчанию применяются ко всему файлу. Например, для вашего примера вы сделаете
sed -i 's/boy/Boy/g
s/girl/Girl/g
/^$/d' file1 file2 ...
Да, есть способ автоматизировать это. И все начинается с выбора подходящего инструмента для работы.
В этом случае вы должны использовать, например, sed
и не пытаться согнуть vi
, который был разработан для интерактивного использования (а не для автоматизации).
Синтаксис замены для sed
в основном такой же, как и для vi
.
sed -i.backup 's/boy/Boy/g' file-name-1 file-name-2 ...
Второй @ ответ Антона . Используйте sed
:
$ sed -e "s/boy/Boy/g" -e "s/girl/Girl/g" -e '/^\s*$/d' file
ПРИМЕЧАНИЕ: (Это также удаляет строки только с пробелами)
Добавьте -i
в sed
, если вы хотите заменить на месте (ваши файлы находятся под контролем версий, верно?). Для нескольких файлов:
$ for $f in $(ls mydir); do
sed -e "s/boy/Boy/g" -e "s/girl/Girl/g" -e '/^\s*$/d' $f
done
Скрипты Vim (gvim,vim) могут быть элегантными и очень просты в адаптации
vi -s edit.vim test.txt
где edit.vim содержит (:wq опционально)
:%s/boy/Boy/g
:%s/girl/Girl/g
:g/^$/d
:wq
где test.txt содержит
boys & girls
boys & girls
boy & girl
boys & girls
вот общий скрипт vim для очистки "слишкообразного" текстового файла
:" clean.vim
:" clean up a text file
:" delete DOS returns (actually superfluous because of non-ASCII
deletion)
:%s/\r//eg
:" delete any non-ASCII including invisibles
:%s/[\x00-\x1f\x80-\xff]/ /eg
:" compress multiple spaces
:%s/\s\s\+/ /eg
:" delete end of line spaces
:%s/\s\+$//e
:" compress multiple blank lines
:v/./,/./-j
:" sort eliminating duplicate lines
:%sort -u
помните вы можете также исходить из vim
:source clean.vim
ПРИМЕЧАНИЕ: Использование sed
является подходящим способом, как показано в @Anthon's answer!
Просто чтобы показать вам, как это можно сделать в vim
. Вы можете использовать команду argdo
в пределах vim
. Из команды :help argdo
в vim
:
:argdo[!] {cmd} Execute {cmd} for each file in the argument list.
пример:
:args *.c
:argdo set ff=unix | update
Это устанавливает опцию 'fileformat' в значение "unix" и записывает файл, если он сейчас есть
изменился. Это сделано для всех файлов *.c
.
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
Это меняет слово "my_foo" на "My_Foo" во всех файлах *.c
и *.h
. Флаг "e" используется для команды :replace
, чтобы избежать ошибки для файлов, где
"my_foo" не используется. :update
записывает файл только в том случае, если были внесены изменения.
Команда :args
сообщает :argdo
, с какими файлами вы хотите запустить следующие {cmd}
. После определения вы запускаете :argdo {cmd}. | update
where {cmd}
can be your s/boy/Boy/g
substitution.
Похоже на то. Я провел следующую проверку, чтобы подтвердить это.
$ for i in {1..3};do echo "dog" > file${i}.txt;done
$ head file*.txt
==> file1.txt <==
dog
==> file2.txt <==
dog
==> file3.txt <==
dog
Теперь заходите в vim
и выполняйте следующие команды:
:args file*.txt
Вы можете подтвердить, что все они были открыты:
:ls
2 %a "file1.txt" line 1
3 "file2.txt" line 0
4 "file3.txt" line 0
Do :argdo ...
:
:argdo %s/dog/cat/g | update
"file1.txt" 1L, 4C written
"file2.txt" 1L, 4C written
"file3.txt" 1L, 4C written
Так что имейте это в виду, если вы намерены использовать этот подход. Он неэффективно открывает каждый файл, который соответствует вашему шаблону на :args
и по очереди применяет к ним команду.
Если предположить, что ваш vi
на самом деле является vim
или gvim
, то, конечно, он может быть реализован в vimscript, но работать с несколькими файлами одновременно может быть затруднительно.
Лучше подходящий инструмент для работы: sed
, редактор потока, который использовал очень похожий синтаксис, как vi
, но предназначен для работы с файлами в виде потока построчно, без взаимодействия.
С опцией -i
, sed
может делать изменения в нескольких файлах. -i.backup перемещает исходный файл
foo.txtв
foo.txt.backup, и вносит изменения в
foo.txt`:
sed -i.backup -e 's/boy/Boy/g' -e 's/girl/Girl/g' -e '/^$/d' f1.txt f2.txt ...
Вы можете запустить его внутри vi
тоже с помощью :!
:
:!sed -i.backup -e 's/boy/Boy/g' -e 's/girl/Girl/g' -e '/^$/d' f1.txt f2.txt ...
Почему бы не использовать sed
?
С помощью sed можно легко перебирать файлы в каталоге:
for f in *.txt
do
sed 's/boy/Boy/g;s/girl/Girl/g;/^\s*$/d' $f > tmp
mv tmp $f
done
Вышеприведенный пример изменит boyy->Boy, girl->Girl и удалит пустые строки.
Если вы находитесь в режиме Arch-Chroot
, вы должны запустить
grub-mkconfig -o /boot/grub/grub.cfg
, кроме
grub-mkconfig -o /mnt/boot/grub/grub.cfg
, потому что :
Когда вы впервые устанавливаете Arch Linux, вы устанавливаете свою файловую систему в / MNT
и установите базовую систему снаружи. Как только вы закончите с базовыми пакетами, вы можете Arch-Chroot
внутри / mnt
и все команды должны быть запущены, поскольку вы находитесь в обычной операционной системе.
Если это не решает вашу проблему, пожалуйста, продолжайте:
Проверьте, есть ли какие-либо ваши партии загрузочного флага.
lsblk -f
Вы можете запустить это:
mkdir -p /boot/grub/locale
cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo
, чтобы избежать некоторых сообщений об ошибках при загрузке с GRUB. Может быть не так, но вы можете дать ему попробовать.
Я не уверен, что может вызвать проблему, но, например, вы можете установить другой загрузчик, такой как Syslinux
, чтобы увидеть, была ли проблема вызвана GRUB или файловой системой.
Поскольку вы устанавливаете в VM, не стесняйтесь использовать его как песочницу и попробуйте все разные способы установки этого.
Я не знаю, как он работает в VM, но я использовал разные конфигурации установки для Grub, поскольку у меня есть жесткий диск UEFI.
-121--100715- Если вам действительно не нужны специальные возможности VIM, вам, вероятно, лучше с использованием неинтерактивных инструментов , как SED
, awk
или Perl / Python / Ruby / Ваш любимый язык сценариев здесь .
, который сказал, что вы можете использовать VIM не интерактивно:
для очень простой обработки текста (т. Е. Использование VIM, как расширенное «SED» или «awk», может быть, просто выиграть от расширенного обычного Выражения в : замена команда
), используйте EX-MODE .
REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"
Примечание: бесшумный пакетный режим (: HELP -S-EX
) Разумит консоль Windows, поэтому вам, возможно, придется сделать CLS
, чтобы убрать после запуска VIM.
# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"
Внимание: VIM будет зависать в ожидании ввода, если файл файл
не существует; Лучше проверить заранее для своего существования! В качестве альтернативы, Vim может прочитать команды от stdin. Вы также можете заполнить новый буфер с помощью текста, прочитанного из stdin, и прочитайте команды из STDERR, если вы используете аргумент -
.
Для более усовершенствованной обработки с участием нескольких окон и реальной автоматизации VIM (где вы можете взаимодействовать с пользователем или оставить VIM, чтобы позволить пользователю перейти), используйте:
vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"
Вот краткое изложение Используемые аргументы:
-T dumb Avoids errors in case the terminal detection goes wrong.
-N -u NONE Do not load vimrc and plugins, alternatively:
--noplugin Do not load plugins.
-n No swapfile.
-es Ex mode + silent batch mode -s-ex
Attention: Must be given in that order!
-S ... Source script.
-c 'set nomore' Suppress the more-prompt when the screen is filled
with messages or output to avoid blocking.