Входной файл (ы):
foo.bar.baz () ->
templateUrl: require('x.jade')
команда perl :
perl -i -0777pe '$_=~s/templateUrl:( \K.*)/templateUrl/;print"var templateUrl =$1\n"' *
Выходные файлы:
var templateUrl = require('x.jade')
foo.bar.baz () ->
templateUrl: templateUrl
Сломать:
- язык сценариев
perl , превосходящий текстовые манипуляции
-i редактировать файлы на месте
-0777 работать с файлом в целом, а не построчно
p распечатать файл (в этом случае файл будет сохранен благодаря -i)
e выполнить следующую команду, в отличие от исполняемого кода , который сохраняется в файле
' инструкции
$_=~s выполняет подстановку всего файла ( $_)
/templateUrl:( \K.*))/ искать строку, соответствующую регулярному выражению templateUrl: .* , и записать строку, соответствующую подвыражению в скобках .* в переменную (по умолчанию она называется $1)
templateUrl/ заменить деталь после маркера \K в совпавшей строке с текстом templateUrl
; отделяет инструкции
print"var templateUrl =$1\n" печать var templateUrl = , содержимое $1 и символ новой строки
- на этом этапе остальная часть файла печатается неявно, потому что был указан переключатель
p
' инструкций
* обрабатывать каждый файл в текущем каталоге
Конечно, могут быть разные подходы, такие как:
perl -i -ne 'if ($_=~s/templateUrl:( \K.*)/templateUrl/){$a="templateUrl =$1"} {$file.=$_} END{print"var $a\n$file"}' *
AWK:
Поскольку вопрос касается sed или awk , стоит отметить, что любой из этих подходов может быть легко реализован в awk:
awk -i 'BEGIN {RS="\0"} {match($0,/templateUrl:( .*)/,m); gsub("templateUrl: .*","templateUrl: templateUrl"); print "var templateUrl ="m[1]$0}' *
awk -i '/templateUrl: / {a="templateUrl = "$2;gsub("templateUrl: .*","templateUrl: templateUrl")} NR==1 {file=$0} NR==2{file=file"\n"$0} END{print a"\n"file}' *