Возможно иметь несколько версий Emacs, установленного на той же машине. Только Emacs 23 загрузил бы файлы из /usr/share/emacs23/site-lisp/
. Все версии Emacs загрузили бы файлы из /usr/share/emacs/site-lisp/
.
Обычно Вы просто используете /usr/share/emacs/site-lisp/
, если нет некоторая причина, код применяется только к конкретной версии Emacs.
Для наблюдения, где Emacs загружает код из введите Control+h v load-path
Войти.
Для предварительного ожидания текста в файл, можно использовать (с реализацией GNU sed
):
sed -i '1i some string' file
Добавление текста так же просто как
echo 'Some other string' >> file
Последняя вещь сделать состоит в том, чтобы поместить это в цикл, который выполняет итерации по всем файлам, которые Вы намереваетесь отредактировать:
for file in *.txt; do
sed -i '1i Some string' "$file" &&
echo 'Some other string' >> "$file"
done
Как уже проиллюстрированный, можно вставить строки текста прямо прежде и после согласующих отрезков длинной линии файла с sed
, использование i
и a
команда соответственно. То, что не показали, - то, что можно сделать это с остротой и для нескольких файлов сразу.
Следующее вставит строку перед первым 1i
и после последней строки $a
. Вставки будут выполняться для всех файлов, соответствующих шарику *.txt
.
sed -i -e '1ivar language = {' -e '$a};' -- *.txt
Оба i
и a
не только работайте с номерами строки, но также и на каждой строке, которая соответствует данному шаблону. Это вставило бы комментарий каждый раз, когда строка содержит var y = 2;
:
sed -i -- '/var y = 2;/i//initialize variable y' *.js
Вот способ сделать это в Perl:
for f in ./*txt; do
perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo &&
mv foo "$f";
done
-i
вместо этого файла не работает замена, это просто печатает к stdout.
– Oleh Prypin
31.05.2016, 23:23
также имеет право быть (с результатами в .Out
файлов):
find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;
Другой, более подробный вариант - исходные файлы, замененные с помощью результата:
find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print
Попробуйте использовать ex
:
ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo
где команды:
bufdo!
выполняет следующие команды для каждого открытого буфера / файла (примечание: это не POSIX ) 1s / ^ / HEAD /
- вставляет текст HEAD
в первый строка в начале строки $ s / $ / TAIL /
- добавляет текст TAIL
в последнюю строку в конце строки и аргументы:
-s
- тихий / быстрый режим -cxa
- сохранить все открытые буферы / файлы и выйти *. foo
- все файлы в текущем каталоге ( *
) с расширением foo
, используйте ** / *. foo
для рекурсивности (после включения globstar: shopt -s globstar
) С gnu awk
, используя расширение inplace
и BEGINFILE
/ КОНЕЧНЫЙ ФАЙЛ
:
gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
Команда, полностью совместимая с POSIX, с использованием ex
:
for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done
Если вы запустите часть команды printf
сам по себе вы увидите точные команды редактирования, которые он передает ex
:
0a
var language = {
.
$a
};
.
x
0a
означает «Добавить текст после строки 0» (другими словами, перед первой строкой). Следующая строка - это буквальный текст, который нужно «добавить» после строки 0. Точка (.
) в строке сама по себе завершает добавляемый текст.
$ a
означает добавление текста после последней строки файла.
x
означает сохранить изменения и выйти.
Однострочник Perl спешит на помощь:
perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt