Как мне добавить строку к каждому файлу в каталоге, которая соответствует моему шаблону? - PullRequest
2 голосов
/ 10 ноября 2010

Я пытаюсь добавить require_once 'bootstrap.php'; строку к каждому schema.yml файлу в определенном каталоге. Я новичок в Linux. Может ли кто-нибудь показать мне one-line-magic-command?

Любая помощь очень ценится!

EDIT Мне нужно искать schema.yml рекурсивно.

Ответы [ 5 ]

6 голосов
/ 10 ноября 2010

Использование sed:

find somedir -name schema.yml | xargs sed -i "1i require_once 'bootstrap.php';"
4 голосов
/ 10 ноября 2010
find somedir -name schema.yml | \
   xargs perl -i.orig -pe 'print "require_once \x27bootstrap.yml\x27\n" if $. == 1; close ARGV if eof' 
2 голосов
/ 10 ноября 2010

Возможно, вы захотите пересмотреть написание слова "bootrstap.yml" ...

#!/bin/bash
TMPFILE=/tmp/reallyuniquetempnamewhateveryouchoose
for f in `find . -name schema.yml`
do
    echo "require_once 'bootrstap.yml';" > $TMPFILE
    cat $f >> $TMPFILE
    mv -v $TMPFILE $f
done

Редактировать: хорошо, что выше - лучше, даже если поначалу это немного сложнее понять

1 голос
/ 13 ноября 2011

Это продолжение ответа @dogbane, который мне понравился, но мне потребовалась некоторая настройка для правильной работы на моем Mac.(Я пытался опубликовать это как комментарий к его ответу, но я не думаю, что вы можете поместить все это форматирование в комментарий.)

В итоге я получил:

find somedir -name schema.yml | xargs sed -i '' "1i\\
require_once 'bootstrap.php';
"

В частности, изменения были следующие:

  1. Параметр -i для sed (расширение, используемое для файла резервной копии для редактирования на месте) требует аргумента, но пустых кавычек достаточно (чтоговорит ему не создавать файл резервной копии).
  2. Команде sed необходимо было иметь \ после адреса (но экранированный, потому что он в двойных кавычках, поэтому он заканчивается как \\), затем новая строка, затем текст для добавления, затем еще одна новая строка, затем закрывающая кавычка.
0 голосов
/ 11 августа 2017

Создайте скрипт быстрого Python:

prepend_my_text.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
from os.path import join

TEXT = """require_once 'bootstrap.php';\n"""

def main():
    for dirpath, _, files in os.walk("."):
        for f in files:
            if f == "schema.yml":
                with file(join(dirpath, f), 'r') as original: data = original.read()
                with file(join(dirpath, f), 'w') as modified: modified.write(TEXT + data)

if __name__ == '__main__':
    main()

и запустите его в каталоге, который вы ищете: $ chmod +x prepend.py $ ./prepend.py

Приятно то, чточто вы можете использовать строковые литералы (тройные кавычки в python), чтобы не беспокоиться о экранировании символов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...