Входной файл (ы):
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}' *