2013-02-23 3 views
0

Я немного ознакомился с sed и awk и понимаю, что оба являются текстовыми манипуляторами.Приложение Sed and awk

Я планирую использовать один из них для редактирования групп файлов (код на каком-либо языке программирования, js, python и т. Д.), Чтобы сделать аналогичные изменения для больших наборов файлов. Прежде всего редактирование определений функций (переданных параметров) и имен переменных, но чем больше я могу сделать, тем лучше.

Я хотел бы знать, если кто-то попытался что-то подобное, и те, у кого есть, есть ли какие-то очевидные подводные камни, на которые нужно обратить внимание? И какой из sed и awk будет предпочтительнее/более подходит для такого приложения. (Или, может быть что-то совсем другое?)

Входной

function(paramOne){ 
//Some code here 
var variableOne = new ObjectType; 
array[1] = "Some String"; 
instanceObj = new Something.something; 
} 

Выход

function(ParamterOne){ 
//Some code here 
var PartOfSomething.variableOne = new ObjectType; 
sArray[1] = "Some String"; 
var instanceObj = new Something.something 
} 
+3

Что более подходит в значительной степени зависит от манипуляции с текстом, которую вы делаете.'awk' будет лучше для некоторых задач,' sed' для других. Вы, вероятно, в конечном итоге используете оба. –

+0

Почему бы вам просто не показать нам, что вы пытаетесь сделать? Включите некоторые входные и ожидаемые результаты. Ваш вопрос во многом зависит от того, что вы на самом деле пытаетесь сделать. – Steve

+0

Да, безусловно, возможно, но не трезвая задача, а угловые шкафы могут сделать ее лишним разочарованием. Время, потраченное на чтение и работу через http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords=orielly+sed+and+awk, будет вознаграждено. Удачи. – shellter

ответ

0

Как только он начинает получать немного более сложным, вы будете переключаться на язык сценариев в любом случае. Так почему бы не начать с питона в первую очередь?

Walking каталоги: walking along and processing files in directory in python

Замена текста в файле: replacing text in a file with Python

Python регулярное выражение HOWTO: http://docs.python.org/dev/howto/regex.html

Я также рекомендую установить Eclipse, + PyDev, как это будет делать отладку много Полегче.

Вот пример простого автоматического заменителя

import os; 
import sys; 
import re; 
import itertools; 

folder = r"C:\Workspaces\Test\"; 
skip_extensions = ['.gif', '.png', '.jpg', '.mp4', '']; 
substitutions = [("Test.Alpha.", "test.alpha."), 
       ("Test.Beta.", "test.beta."), 
       ("Test.Gamma.", "test.gamma.")]; 

for root, dirs, files in os.walk(folder): 
    for name in files: 
     (base, ext) = os.path.splitext(name); 
     file_path = os.path.join(root, name); 
     if ext in skip_extensions: 
      print "skipping", file_path; 
     else: 
      print "processing", file_path; 

      with open(file_path) as f: 
       s = f.read(); 

      before = [[s[found.start()-5:found.end()+5] for found in re.finditer(old, s)] for old, new in substitutions]; 
      for old, new in substitutions: 
       s = s.replace(old, new); 
      after = [[s[found.start()-5:found.end()+5] for found in re.finditer(new, s)] for old, new in substitutions]; 

      for b, a in zip(itertools.chain(*before), itertools.chain(*after)): 
       print b, "-->", a; 

      with open(file_path, "w") as f: 
       f.write(s); 
+0

, используя полноценный язык программирования/сценариев, такой как perl или python, не должен быть необходим для простой обработки текста. Не хватает ли простого сочетания sed, awk и bash? – ffledgling

+2

Это должен быть комментарий. – Steve

+0

«Простое сочетание sed, awk и bash» довольно часто бывает сложнее и сложнее в обслуживании, чем в сценарии. Дело в том, что есть отладчики для языков сценариев, в то время как сценарии оболочки, как правило, сложнее отлаживать. –

2

Вот GNU AWK (для «gensub()» функция) скрипт, который превратит ваш входной файл примера в необходимый выходной файл:

$ cat tst.awk 
BEGIN{ sym = "[[:alnum:]_]+" } 
{ 
    $0 = gensub("^(" sym ")[(](" sym ")[)](.*)","\\1(ParameterOne)\\3","") 
    $0 = gensub("^(var)(" sym ")(.*)","\\1PartOfSomething.\\2\\3","") 
    $0 = gensub("^a(rray.*)","sA\\1","") 
    $0 = gensub("^(" sym " =.*)","var \\1","") 

    print 
} 

$ cat file 
function(paramOne){ 
//Some code here 
var variableOne = new ObjectType; 
array[1] = "Some String"; 
instanceObj = new Something.something; 
} 

$ gawk -f tst.awk file 
function(ParameterOne){ 
//Some code here 
var PartOfSomething.variableOne = new ObjectType; 
sArray[1] = "Some String"; 
var instanceObj = new Something.something; 
} 

НО подумайте о том, как ваш реальный вход может отличаться от этого - вы могли бы иметь больше/меньше/различное расстояние между символами. У вас могут быть задания, начинающиеся с одной строки и заканчивающиеся на следующем. У вас могут быть комментарии, которые содержат похожие строки для кода, который вы не хотите изменять. У вас может быть несколько операторов в одной строке. и т. д. и т. д.

Вы можете решать каждую проблему по одному, но это может занять вас намного дольше, чем просто обновлять ваши файлы, и, скорее всего, вы все равно не сможете полностью ее исправить.

Если ваш код очень хорошо структурирована и строго следует конкретный, весьма ограничительный формат кодирования, то вы могли бы быть в состоянии сделать то, что вы хотите с помощью языка сценариев, но ваши лучшие ставки либо:

  1. Изменение файлы, если их меньше, скажем, 10 000 из них или
  2. получить парсер (например, компилятор) для языка, на котором записаны ваши файлы, и изменить это, чтобы выплевывать обновленный код.
Смежные вопросы