Как добавить новую строку после выражения

Use 2 particiones raíz separadas y 1 compartida /home. Luego, debe actualizar los 2 sistemas de forma independiente.

0
03.08.2017, 17:25
3 ответа

Вот Perl-решение:

$ perl -pe 's/(\d+:.*?)(?=\d+:|$)/$1\n/g' file
random_string
83: some words 
45: large error report 
326: send emails to certain peple

random_string
34: some words 
143: job success

Пояснение

  • (\d+:.*?):соответствует одному или нескольким числам (\d+), за которыми следует :, а затем наименьшая строка (?в .*?делает ее не-жадной, она остановится, как только появится первая найдено совпадение ), соответствующее остальной части регулярного выражения. Здесь это будет продолжаться до части, описанной ниже.
  • (?=\d+:|$):(?=foo)называется положительным прогнозом . Он будет совпадать, но то, что совпало, не будет включено в фактический результат. Таким образом, bar(?=foo)будет соответствовать всем случаям bar, за которыми следует foo. Здесь мы ищем либо строку чисел, за которой следует :(\d+:), либо конец строки ($).

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

1
28.01.2020, 02:45

awkкажется, помогает:

$ awk '{ for( i=1; i<=NF; i++ ) { if( match( $i, ":" ) ) { printf "\n" } printf( "%s ", $i ) } }' /path/to/file
random_string
83: some words
45: large error report
326: email certain people random_string
34: some words
143: job success
0
28.01.2020, 02:45

Сравнивая ваш ввод с выводом, кажется, что ваше описание того, что вы хотите, неверно. Вы говорите «Я хочу настроить шаблон#:(на число, за которым следует двоеточие )и добавить новую строку после» , хотя более точным описанием было бы:

  • замените пробел перед любым количеством цифр, за которым следует двоеточие, на новую строку.
  • вставить новую строку перед каждой не -пустой строкой, не начинающейся с цифры.
  • пропустить первую строку ввода, потому что в ней ничего не нужно менять.

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

$ sed -E -e '2,$ {s/ ([0-9]+:)/\n\1/g; s/^[^0-9]/\n&/}' file.txt
random_string
83: some words
45: large error report
326: send emails to certain peple

random_string
34: some words
143: job success

Кстати, если перед [0-9]+:есть табуляция, а не пробелы, или несколько пробелов, используйте [[:space:]]+вместо пробела. например.

sed -E -e '2,$ {s/[[:space:]]+([0-9]+:)/\n\1/g; s/^[^0-9]/\n&/}' file.txt
0
28.01.2020, 02:45

Теги

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