Вы можете объединять несколько выражений СЭД вместе с ;
характером. Вот посмотрите на каждый отдельно.
Первое выражение, /^void.*{$/!b
, имеет выражение-разделитель между разделителем /
. Это соответствует:
^
- начало линии
void
- за которым следуют символы "недействительным"
.*
- а затем что-нибудь
{
- а затем левая фигурная
$
- далее следует конец линии
Модификатор в этом первом выражении, !b
, означает, что если совпадение не соответствует, прервите оценку sed.
Выражение :a
является ярлыком. Он используется с функцией goto-like sed, называемой ветвлением. Мы увидим, как метки используются в следующем выражении.
выражение /\n}$/bb
матчи:
\n
- символ новой строки
}
- а затем правой фигурные
$
- а затем к концу линии
Модификатор bb
означает, что если вы найдете совпадение «ветвь» на метке b. Метка b определяется в более позднем выражении как :b
.
Выражение $!{N;ba}
должно рассматриваться как одно, хотя оно имеет ;
посередине. Колонки в этом случае представляют собой последовательность команд, которые должны выполняться вместе.
$!
- если это не конец ввода
{
- начать группу команд (в данном случае, есть два из них)
N
- читать еще одну линию, молча
ba
- ответвление на метку a
}
- конечная группа команд
Следующая метка :b
, которую мы ударим, когда мы сопоставим один }
на отдельной строке, используя выражение /\n}$/bb
.
Наконец, есть два шаблона замены, которые являются довольно стандартным регулярным выражением. s
перед выражением по существу означает s/find_this/replace_it_with_this/
. В случае s/\n/&test1&/
, мы имеем:
\n
- найти строку
/
- и заменить его
&
- вещь, которая была подобрана в первом выражении (в этом случае символ новой строки)
test1
- слово test1
&
- и снова вещь, которая была подобрана
Таким образом, в основном s/\n/&test1&/
означает замену следующего \n
на \ntest1\n
.
Последнее выражение похоже, но вводит что-то называемое захватами. Захваты позволяют вам по-прежнему соответствовать всем, но сохраняйте все между \(
и \)
для использования в заменяющей части выражения. Например, s/a\(b\)c\(d\)e/\1 \2/
выводит b d
, если задана входная строка abcde
. В этом примере \1
и \2
заменяются вещами, которые захватываются в экранированных парнах, b
и d
, соответственно.
s
- это модель замещения:
/
- найти
\(
- и поместить в переменную \1
замены
.
- ничего
*
- и любое его количество
\n
- включая первый символ новой строки вы столкнетесь
\)
- (конец захвата для \1
)
\(
- и поместить в переменную \2
замены
.
- ничего
*
- и любая его сумма
\n
- в том числе первого символа новой строки вы столкнетесь
\)
- (конец захвата для \2
)
/
- и заменить все это с
\1
- первая вещь, захваченной,
test2\n
- test2 \ n,
\2
- и вторая вещь снята.
Похоже, что человек, который ответил на ваш вопрос, добавил [объяснение] (http://stackoverflow.com/a/14215634/1938444). – mgamba
он добавил экспансию в группы, и я даже не понимаю этого. я хотел понять по характеру по характеру – user175386049
sed - отличный инструмент для простых замещений на одной строке, но для чего-то еще вы должны использовать awk вместо этого. Я использую sed в течение 30 лет и даже не могу догадаться о том, что делает ваша команда. Если вы обнаружите, что используете больше команд «s» и «g», вы, вероятно, используете неправильный инструмент, поэтому не тратьте время на это, просто получите awk-решение, и оно будет более четким, простым и легче улучшить в будущем. –