2010-11-10 1 views
2

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

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

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

+1

Принятый ответ в этой теме должен хорошо работать: http://stackoverflow.com/questions/487894/how-can-i-add-a-line-to-a-file-in-a-shell-script – birryree

+0

" .. Покажите мне команду? Нет ни одной команды. 'mv' http://ss64.com/bash/mv.html' for loop' http://www.cyberciti.biz/faq/bash-for-loop/ и некоторые общие сценарии bash http://tldp.org /HOWTO/Bash-Prog-Intro-HOWTO.html, если у вас нет времени проверить это http://www.debian-administration.org/articles/150 – soulseekah

ответ

4
find somedir -name schema.yml | \ 
    xargs perl -i.orig -pe 'print "require_once \x27bootstrap.yml\x27\n" if $. == 1; close ARGV if eof' 
+0

найти. -name schema.yml | xargs perl -i.orig -pe 'print "require_once \ x27bootstrap.php \ x27 \ n"; если $. == 1; закрыть ARGV, если eof '---- эта команда вызывает ошибку: синтаксическая ошибка на -e строка 1, рядом с «if $.» Выполнение -e отменено из-за ошибок компиляции. xargs: perl: вышло со статусом 255; aborting – vooD

+0

удалить точку с запятой – tchrist

+0

Я удалил первую точку с запятой! благодаря! оно работает! – vooD

2

Вы можете просмотреть вашу орфографию «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 

Edit: значительно выше один вкладыш лучше, даже если это немного сложнее понять, в первый :)

+0

Два выхода становятся единым: 'echo" foo "| cat-file> "$ TMPFILE" '. Обратите внимание на использование кавычек: 'mv '$ TMPFILE" "$ f" '. '' For ... $ (find) 'fail, если имена каталогов имеют пробелы. Используйте 'find ... | при чтении -r f'. –

+0

'TMPFILE = $ (mktemp -t foo)' – chepner

6

Использование СЭД:

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

Мне пришлось слегка изменить это, чтобы он работал на моем Mac. Я опубликовал свой окончательный результат как [отдельный ответ] (http://stackoverflow.com/questions/4144703/how-do-i-prepend-a-string-to-each-file-in-dirrectory-that-matches- my-pattern/8107718 # 8107718), поэтому я мог бы добавить к нему необходимое форматирование. – Kelan

1

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

я закончил с:

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

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

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

Благодарим вас за ответ на этот старый вопрос. Я думаю, кто-то найдет это очень полезным. – vooD

0

Создать быстрый сценарий 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), чтобы не беспокоиться об экранирующих символах

Смежные вопросы