Просто не знаю, что плохой ответ получает так много голосов. Это довольно простой ответ, но вы делаете его сложным.
// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000; // in a function we use "this";
alert(article_count);
Я согласен с @Aaron, но если вы все еще хотите точно sed
, посмотрите на это:
$ cat /tmp/del.txt
void some_function_declaration(char var1, char var2)
{
...
}
void enother_function_declaration(char var1, char var2)
{
...
}
И применяя sed
:
$ cat /tmp/del.txt | sed ':a;N;$!ba;s/)\n{/)\{\ntime_exe(__func__, cl(clock()));/g'
void some_function_declaration(char var1, char var2){
time_exe(__func__, cl(clock()));
...
}
void enother_function_declaration(char var1, char var2){
time_exe(__func__, cl(clock()));
...
}
Я думаю, это выглядит так, как вы хотели
UPD
Позвольте мне объяснить ..
Более кроссплатформенный совместимый синтаксис:
sed -e ':a' -e 'N' -e'$!ba' -e 's/)\n{/)\n{ ... ;/g'
, где
':a'
- создает метку ветви (с именем a
) которые могут быть возвращены позже 'N'
- добавляет следующую строку к текущей (с \n
между ними) '$!ba'
- переходит на метку a
, если следующая строка - последняя строка 's/)\n{/)\n{ ... ;/g'
- выполняет глобальное замещение в одной строке, состоящей из всех строк и \n
с Это может сработать для вас (GNU sed):
sed ':a;/)$/!b;n;/^{/!ba;c{ time_exe(__func__, cl(clock()));' file
Если текущая строка не заканчивается на )
, выход из любой дальнейшей обработки с помощью sed. В противном случае выведите текущую строку и прочитайте следующую. Если эта строка не начинается с проверки {
с начала, в противном случае измените ее на желаемый формат.
Требуемый формат также может быть добавлен или вставлен, см. Ниже:
sed ':a;/)$/!b;n;/^{/!ba;a{ time_exe(__func__, cl(clock()));' file
Или,
sed ':a;/)$/!b;n;s/^{/& time_exe(__func__, cl(clock()));/;Ta' file
Вы должны избегать использования sed
, который является линейным инструментом и плохо справляется с подобными задачами.
Если вы настаиваете на использовании sed
и используете GNU sed
, вы можете, однако, использовать опцию -z
/ --null-data
, которая будет считывать весь файл за один проход (чтение записей, разделенных NUL-байтами, а не перевод строки). с разделенными записями) и позволит вам использовать шаблон )\n{
, как и следовало ожидать:
$ { echo "line1)"; echo "{line2"; } | sed -z 's/)\n{/X/g'
line1Xline2
Поскольку для этого требуется загрузка всего файла в память, ожидайте ужасных результатов для огромных файлов.
Если вам нравится неуправляемая тарабарщина, вы можете решить эту проблему с помощью менее известных sed
команд P
, t
и D
:
sed '/)$/{N;s/)\n{/) {\n\ttime_exe(__func__, cl(clock()));/;t;P;D}'
Это работает, загружая дополнительную строку в пространстве образца (N
), когда встречается строка, заканчивающаяся в )
, пытаясь заменить образец двух строк, и печать (P
) и удаление (D
) первой строки из пространства шаблона, если шаблон не сопоставлен (в противном случае t
переходит к следующей итерации), оставляя вторую строку в пространстве шаблона для использования в качестве первой строки следующей итерации.
Использование /first line pattern/{N;s/whole pattern/replacement/}
часто достаточно хорошо, но может потерпеть неудачу, поскольку N
будет использовать строку, с которой вы не будете тестировать шаблон первой строки. Это иллюстрируется здесь .