Если строка и следующая строка начинается с цифры, добавьте текст к соответствующей строке - PullRequest
0 голосов
/ 02 февраля 2020

Как добавить строку в начало строки, если строка и следующая строка начинаются с цифр?

От:

random text
random text
65345
234
random text
random text
random text
random text
random text
random text
9875
789709
random text
random text
random text

До:

random text
random text
appended text 65345
234
random text
random text
random text
random text
random text
random text
appended text 9875
789709
random text
random text
random text

Добавление ко всем строкам, которые начинаются с цифр, так же просто, как

$ printf "hello\n123\n" | sed 's/^[0-9]/appended text &/'
hello
appended text 123

Не знаю, как сделать то, что я пытаюсь сделать.

«случайный текст» может закончиться в номере

Есть идеи?

Ответы [ 3 ]

1 голос
/ 02 февраля 2020

Просто прочитайте весь файл

perl -0777pe's/^(?=\d.*\n\d)/prepended text /mg'

Вы также можете работать с двухстрочным скользящим окном.

perl -ne'
   push @buf, $_;
   next if @buf < 2;
   $buf[0] = "prepended text $buf[0]" if $buf[0] =~ /^\d/ && $buf[1] =~ /^\d/;
   print(shift(@buf));
   END { print @buf; }
'

См. Указание файла для обработки Perl однострочник .

1 голос
/ 02 февраля 2020

Такого рода вещи лучше всего делать с помощью awk. Что-то вроде:

awk 'prev ~ /^[0-9]/ && /^[0-9]/ { prev = "prepended text " prev} 
    NR>1 {print prev} 
    {prev=$0}
    END {print prev}' input 

На самом деле, это, вероятно, "лучший" результат в perl, но в наши дни это выглядит немодно:

perl -0777 -pe '1 while s/(?<=^)(\d.*\n\d)/prepended text $1/cm' input
0 голосов
/ 03 февраля 2020

Это может работать для вас (GNU sed):

sed -E ':a;N;s/\n/&/2;Ta;s/\n([0-9]+\n[0-9]+)$/ \1/;ta;P;D' file

Открыть окно из 3 строк в пространстве образца. Если 2-я и 3-я строки состоят только из цифр, замените 1-ую новую строку пробелом и снова заполните окно. В противном случае выведите / удалите первую строку в пространстве шаблона и повторите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...