Основываясь на отличном ответе, найденном здесь< /a>, я пытаюсь использовать некоторые из этих команд внутри файла сценария sed, который будет вызываться с использованием sed -f. В файле есть несколько команд sed, и он работает без проблем. Теперь мне нужно добавить эти две строки в конец файла:

/^$/{N;s/^$\nbegin of this/begin/g}
/^$/{N;s/^$\nend of this/end/g}

Который в основном ищет пустую строку (^$), за которой следует следующая фраза begin of this или end of this, и продолжает удалять пустую строку и заменять следующую строку только begin или end.

Каждая команда, запускаемая независимо, работает без проблем, но когда она помещается в файл сценария, ад ломается. Некоторые из моих предыдущих команд перестают работать (например, s/\\ \\ //g, которая просто удаляет строку \ \). Что еще более важно, выполняется только первая из двух предыдущих многострочных команд, почему? Я пропустил какой-то переключатель командной строки для sed? Возможно ли иметь несколько многострочных команд в одном файле сценария?

В качестве дополнительных «точек» я хотел бы заменить эти две строки регулярных выражений группой захвата, то есть /^$/{N;s/^$\n(begin|end) of this/\1/g}, но это также не работает, даже не запуская его непосредственно в командной строке.

Я действительно надеюсь, что у этого есть относительно простое/выполнимое решение, так как я предпочитаю не использовать perl или awk, но если это ограничение самого sed или это чрезвычайно сложно выполнить, я буду (очень неохотно) используют альтернативы.

Вот очень простой образец текста:

some text

begin of this
some more text

end of this

A sentence

Another sentence 

Что должно выглядеть так:

some text
begin
some more text
end

A sentence 

Another sentence 
0
Felipe 2 Май 2020 в 21:33
Привет. Пожалуйста, вставьте весь сценарий, который у вас есть, и пример входного файла. Это сделало бы проблему намного яснее.
 – 
seshoumara
1 Май 2020 в 14:04
Скажем для примера, что весь скрипт состоит только из двух предыдущих строк, вы увидите, что выполняется только первая. Я запускаю его с помощью sed -r -f. Я добавлю образец текста к вопросу
 – 
Felipe
1 Май 2020 в 21:16
Вы хотите удалить только пустые строки перед этими ключевыми словами или все? Сначала попробуйте sed -r '/^$/{$!N;s:^\n(begin|end) of this$:\1:}' file.txt.
 – 
seshoumara
2 Май 2020 в 19:59
1
Выполняется только первая из двух команд, потому что первая команда изменяет пространство шаблонов, чтобы оно больше не было пустым. Каждая команда применяется к пространству паттернов, как в этом месте скрипта. /^$/ не "ищет" пустые строки. Если пространство шаблона в этом месте скрипта пусто, оно совпадает.
 – 
Kusalananda
2 Май 2020 в 21:37
Так что я тоже должен использовать пространство удержания? Как мне это сделать? Или я могу просто запустить одну многострочную команду с захватом групп? Группы захвата тоже не работали
 – 
Felipe
2 Май 2020 в 21:50

1 ответ

Я думаю, что @seshoumara решил это, верно? впрочем, это я придумал

sed  -r '/^$/{N; s/\n(begin|end) of this/\1/g}' file
0
capt_zipoc 1 Авг 2020 в 17:34