Удалить только первый разрыв строки - PullRequest
1 голос
/ 25 апреля 2020

У меня довольно много файлов, в которых я хочу избавиться от определенного переноса строки. Строка всегда начинается с «Заголовок:», и поэтому я попробовал следующую команду:

find . -type f -exec sed -i 's/^Title: \n\t*/Title:/g' {} \;

Но из того, что я понимаю, sed обрабатывает только одну строку за раз, и поэтому выше не будет Работа. Есть ли способ удалить разрыв строки (в нескольких файлах), но только если строка начинается с какой-то строки?

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

С GNU sed вы можете использовать

sed '/^Title: $/{N;s/.*\n\t*\(.*\)/Title:\1/}'

См. онлайн sed демо

Подробности

  • /^Title: $/ - находит строку с содержимым, равным Title:
  • {N;s/.*\n\t*\(.*\)/Title:\1/} - блок выполняется после того, как найдена строка выше:
    • N - получает следующую строку и добавляет новую строку и эту строку в пространство шаблона
    • s/.*\n\t*\(.*\)/Title:\1/ - заменяет пространство шаблона (которое содержит две строки сейчас), используя шаблон .*\n\t*\(.*\), который соответствует
      • .* - любые 0+ символов
      • \n\t* - новая строка и вкладки 0+
      • \(.*\) - Группа захвата 1: любые 0+ символов
      • /Title:\1/ - шаблон замены, Title: и значение внутри группы 1.
0 голосов
/ 26 апреля 2020

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

sed -Ez 's/((^|\n)Title:) \n\t*/\1/g' file

Перетянуть файл в память с помощью опции -z.

Разрешить расширенное регулярное выражение используя опцию -E.

Если первая или любая последующая строка начинается с Title:, за которым следует новая строка и ноль или более вкладок, удалите трио пробела, за которым следует новая строка, за которой следует ноль или более tabs.

Это может привести файл к дальнейшему соответствию, поэтому может понадобиться al oop:

sed -Ez ':a;s/((^|\n)Title:) \n\t*/\1/g;ta' file
0 голосов
/ 25 апреля 2020

Я бы сделал это так:

sed '/^Title:/{N;s/[[:blank:]]*\n[[:blank:]]*/ /}'

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

Это предполагает, что строка «Заголовок:» может также включать другой текст (в той же строке), и это следует сохранить. Это мое понимание вашего вопроса, исходя из того, что вы сказали словами (это не соответствует вашей попытке).

Вам может потребоваться специальная обработка, если ваш ввод может содержать две последовательные строки, начинающиеся с "Заголовок: «(это решение объединит их в одну строку), и если самая последняя строка начинается с« Заголовок: »(это решение просто оставит его в покое - если, конечно, строка прямо над ним также не начинается с« Заголовок: «).

...