Как сопоставить) \ n {используя sed?

Просто не знаю, что плохой ответ получает так много голосов. Это довольно простой ответ, но вы делаете его сложным.

// 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);
1
задан aboitier 16 January 2019 в 15:07
поделиться

3 ответа

Я согласен с @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 с
0
ответ дан viktorkho 16 January 2019 в 15:07
поделиться

Это может сработать для вас (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
0
ответ дан potong 16 January 2019 в 15:07
поделиться

Вы должны избегать использования 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}'

Try это здесь!

Это работает, загружая дополнительную строку в пространстве образца (N), когда встречается строка, заканчивающаяся в ), пытаясь заменить образец двух строк, и печать (P) и удаление (D) первой строки из пространства шаблона, если шаблон не сопоставлен (в противном случае t переходит к следующей итерации), оставляя вторую строку в пространстве шаблона для использования в качестве первой строки следующей итерации.

Использование /first line pattern/{N;s/whole pattern/replacement/} часто достаточно хорошо, но может потерпеть неудачу, поскольку N будет использовать строку, с которой вы не будете тестировать шаблон первой строки. Это иллюстрируется здесь .

0
ответ дан Aaron 16 January 2019 в 15:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: