Как я добавляю текст к началу и концу нескольких текстовых файлов в Bash?

Возможно иметь несколько версий 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 Войти.

24
15.10.2016, 09:21
8 ответов

Для предварительного ожидания текста в файл, можно использовать (с реализацией 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
27
27.01.2020, 19:40

Можно использовать GNU sed

Как уже проиллюстрированный, можно вставить строки текста прямо прежде и после согласующих отрезков длинной линии файла с 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
8
27.01.2020, 19:40

Вот способ сделать это в Perl:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done
2
27.01.2020, 19:40
  • 1
    @StéphaneChazelas -i вместо этого файла не работает замена, это просто печатает к stdout. –  Oleh Prypin 31.05.2016, 23:23
  • 2
    @OlehPrypin, действительно Ваше право. Комментарий удален. –  Stéphane Chazelas 01.06.2016, 09:31

также имеет право быть (с результатами в .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
1
27.01.2020, 19:40

Попробуйте использовать 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 )
1
27.01.2020, 19:40

С gnu awk , используя расширение inplace и BEGINFILE / КОНЕЧНЫЙ ФАЙЛ :

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
1
27.01.2020, 19:40

Команда, полностью совместимая с 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 означает сохранить изменения и выйти.

5
27.01.2020, 19:40

Однострочник Perl спешит на помощь:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
0
27.01.2020, 19:40

Теги

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