Замените несколько строк другой строкой в нескольких файлах

Движение признаками, о которых Вы сообщаете, это идет вне поврежденного 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 ошибка не является причиной проблемы, но может быть другим признаком.

7
17.09.2014, 19:40
9 ответов

И встроенный скрипт vi :

$ vi test.txt -c '%s/boy/Boy/g | %s/girl/Girl/g | g/^$/d | wq'
2
27.01.2020, 20:13

sed - это инструмент для вас. Большинство команд, которые вы будете использовать в vi , будут доступны в sed , поэтому обучение не требует особого труда. Команды в vi , которые запускаются с : , основаны на основном редакторе ed , и они также доступны в sed . Вы будете использовать эти команды без : , и они по умолчанию применяются ко всему файлу. Например, для вашего примера вы сделаете

sed -i 's/boy/Boy/g
s/girl/Girl/g
/^$/d' file1 file2 ...
0
27.01.2020, 20:13

Да, есть способ автоматизировать это. И все начинается с выбора подходящего инструмента для работы.
В этом случае вы должны использовать, например, sed и не пытаться согнуть vi , который был разработан для интерактивного использования (а не для автоматизации).

Синтаксис замены для sed в основном такой же, как и для vi .

 sed -i.backup 's/boy/Boy/g' file-name-1 file-name-2 ...
13
27.01.2020, 20:13

Второй @ ответ Антона . Используйте 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
0
27.01.2020, 20:13

Скрипты 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
10
27.01.2020, 20:13

ПРИМЕЧАНИЕ: Использование 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 и по очереди применяет к ним команду.

2
27.01.2020, 20:13

Если предположить, что ваш 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 ...
0
27.01.2020, 20:13

Почему бы не использовать 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 и удалит пустые строки.

3
27.01.2020, 20:13

Если вы находитесь в режиме 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.
0
27.01.2020, 20:13

Теги

Похожие вопросы