Я хочу добавить {% load static%} ко второй строке во всех html-файлах в каталоге

это моя структура папок.

 ├── fullstack
│   └── index.html
├── git
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   └── git.html
├── home.html
├── html_css
│   ├── 10.html
│   ├── 11.html
│   ├── 12.html
│   ├── 13.html
│   ├── 14.html
│   ├── 15.html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   ├── 6.html
│   ├── 7.html
│   ├── 8.html
│   ├── 9.html
│   └── html-css.html
├── javascript
│   ├── 10.html
│   ├── 11.html
│   ├── 12.html
│   ├── 13.html
│   ├── 14.html
│   ├── 15.html
│   ├── 16.html
│   ├── 1.html
│   ├── 2.html
│   ├── 3.html
│   ├── 4.html
│   ├── 5.html
│   ├── 6.html
│   ├── 7.html
│   ├── 8.html
│   ├── 9.html
│   └── javascript.html
└── projects
    ├── facebook_project
    │   ├── 10.html
    │   ├── 11.html
    │   ├── 12.html
    │   ├── 13.html
    │   ├── 14.html
    │   ├── 15.html
    │   ├── 1.html
    │   ├── 2.html
    │   ├── 3.html
    │   ├── 4.html
    │   ├── 5.html
    │   ├── 6.html
    │   ├── 7.html
    │   ├── 8.html
    │   ├── 9.html
    │   └── facebook-project.html
    ├── one_mac_project
    │   ├── 10.html
    │   ├── 11.html
    │   ├── 1.html
    │   ├── 2.html
    │   ├── 3.html
    │   ├── 4.html
    │   ├── 5.html
    │   ├── 6.html
    │   ├── 7.html
    │   ├── 8.html
    │   ├── 9.html
    │   └── one-mac-project.html
    └── projects.html

1 ответ1

1

Это общий FAQ.

find . -type f -name '*.html' -exec sed -i '2s/^/{% load static %}/' {} \;

Не все варианты sed поддерживают -i а некоторые (особенно * BSD, включая MacOS) требуют пустой аргумент для опции, например sed -i '' '2s/...

Выражение адреса 2 соответствует второй строке, а регулярное выражение ^ соответствует началу строки; поэтому мы говорим «замените (пустую строку в) начало строки этим текстом в строке 2».

Я, очевидно, интерпретирую "добавить во вторую строку" как вставку этого статического нового текста перед существующим содержимым строки. Есть и другие операции, которые вы можете выполнить, такие как вставка новой строки, замена существующего содержимого или вставка нового статического текста после текущего содержимого строки. Все это легко сделать с помощью sed , но синтаксис может немного отличаться на разных платформах.

Если у вас вообще нет sed -i возможно, стоит вместо этого использовать Perl.

find ... -exec perl -i -pe 's/^/{% load static %}/ if $. == 2; $. = 0 if eof' {} +

В таком количестве слов find ... -exec x {} + говорит, что нужно выполнить x во всех файлах, которые соответствуют предикатам в ... Разница между + и \; является то, что первый будет работать как можно меньше экземпляров; так

x foundfile1.html path/to/foundfile2.html another/foundfile3.html ...

тогда как с \; вы запускаете один экземпляр для каждого файла:

x foundfile1.html
x path/to/foundfile2.html
x another/foundfile3.html
:

что, очевидно, намного менее эффективно. В варианте Perl я специально настроил скрипт так, чтобы он отслеживал номер строки для каждого входного файла отдельно, чтобы вы могли использовать этот более эффективный синтаксис (при условии, что ваша версия find поддерживает его); тогда как с помощью sed адрес 2 совпадает только со второй строкой во всей последовательности файлов, и поэтому мы все равно вынуждены выполнять один экземпляр этого скрипта на файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .