как удалить символ новой строки с помощью Sed или perl

С помощью sedвы можете сделать что-то вроде:

sed '
  G
  :1
      s/\([[:alpha:]]\)\([[:alpha:]]\{4\}\)\(\n\)/\1\3 \2/
  t1
  s/\n//
'

Мы используем символ новой строки в качестве бегущего маркера. (Новая строка — это единственный символ, который не будет появляться внутри начального пространства шаблона ). Мы добавляем его в конце изначально. Затем, пока мы находим ABCDE<marker>(, где ABCDE — 5 буквенных символов, вы можете заменить [[:space:]]на [^[:blank:]], если хотите рассматривать слова как последовательности не -пробелов, а не последовательности букв ), мы заменяем его на A<marker> BCDEи зацикливаем. И удаляем маркер в конце.

Таким образом,мы уверены, что обработаем только то слово, которое находится только в конце строки.

Если бы вы хотели разбить таким образом каждое слово, а не только последнее слово, это было бы проще:

sed -e :1 -e 's/\(.*[[:alpha:]]\)\([[:alpha:]]\{4\}\)/\1 \2/;t1'

Если ваш ввод содержит разложенные символы (, как в выводе printf 'abcd\u00e9e\u0301f\n':abcdééf), вы можете сделать:

perl -Mopen=locale -lpe 'while(s/.*(?=\w)\X\K(?:(?=\w)\X){4}/ $&/){}'
0
06.11.2019, 13:51
2 ответа

Мы можем использовать sed 's/\n/ /g', обратите внимание на пробел после второй косой черты, приведенное выше выражение заменяет все символы новой строки пробелом

0
28.01.2020, 02:39

Мы не можем использоватьsed s'/\n/ /g'

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

В awk вы можете переключить символ RS 'конец -строки -так, чтобы использовался какой-то другой символ, и тогда новые строки останутся в покое. Или (в gawk )можно сделать RS пустым, и тогда весь файл войдет одной длинной строкой. Я не могу придумать никаких других стандартных команд, которые позволили бы вам сделать это.

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

Кроме того, OP находится на SunOS 5.11, и я готов поспорить на доллары с пончиками, что длина строки ограничена чем-то вроде 2048 символов. Таким образом, общий XML сломает его. Solaris awk разбивается на 6144 (6K )символов.

Я даже не уверен, что этот файл будет правильным XML. ОП говорит, что нет необходимого (отсутствующего, предположительно мертвого )тега, поэтому могут скрываться и другие проблемы с домашним пивом -.

0
28.01.2020, 02:39

Теги

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