Sed регулярное выражение с переменными окончаниями не совпадает - PullRequest
1 голос
/ 21 апреля 2020

У меня есть файл, который в простом примере выглядит следующим образом:

some_file_name{
something
otherthing2
otherthing3
}

Как только "some_file_name" может заканчиваться концом строки, пробелом или {так что мне нужно соответствовать каждому варианту. Чтобы еще больше усложнить ситуацию, в some_file_name содержится /, так что разделитель должен быть другим ... и в конце мне нужно заменить «что-то» между some_file_name {и next}, чтобы результат был:

some_file_name{
something_replaced
otherthing2
otherthing3
}

Я дошел до:

sed -r "\%some_file_name\($\|[[:space:]]\|\{\)%,\%\}%{s/something/something_replaced/}" "file.txt"

(sed -r обязателен). Мои лучшие догадки, проблема где-то здесь: \($\|[[:space:]]\|\{\), где я пытаюсь сопоставить 3 возможных окончания ... но на всю жизнь я не могу понять, чего не хватает.

sed --version
sed (GNU sed) 4.2.2

1 Ответ

1 голос
/ 21 апреля 2020
sed -r "\%some_file_name($|[[:space:]]|\{)%,\%\}%{s/something/something_replaced/}" "file.txt"

-r-E, который является более переносимым, поэтому, когда вы можете выбрать это), включает расширенные регулярные выражения. Таким образом, вы не должны избегать скобок группирования и вертикальной черты, иначе они трактуются буквально как sed.

Все еще в замешательстве? Учтите это:

$ echo '(' | sed 's/(/X/'
X
$ echo '(' | sed -E 's/(/X/'
sed: -e expression #1, char 6: Unmatched ( or \(
$ echo '(' | sed -E 's/\(/X/'
X
...