Как изменить то, что sed считает разделителем строк - PullRequest
6 голосов
/ 03 августа 2011

Поскольку я новичок в sed, мне очень приятно видеть, что sed не думает, что символ \ r является допустимым разделителем строк.

Кто-нибудь знает, как сказать sed, какойсимволов, которые я хотел бы использовать в качестве разделителя строк при обработке большого количества строк текста?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Вы можете указать это с помощью переменной RS (разделитель записей) в awk: awk 'BEGIN {RS = "\r"} ...

Или вы можете конвертировать с: tr '\r' '\n'

2 голосов
/ 03 августа 2011

(Чтобы сделать приведенные ниже примеры более понятными и менее двусмысленными, я буду использовать od util .)

Невозможно сделать, например, флаг. Могу поспорить, что лучшее решение - это то, которое цитировалось в предыдущих ответах: tr. Если у вас есть файл, подобный приведенному ниже:

$ od -xc slashr.txt
0000000      6261    0d63    6564    0d66                                
           a   b   c  \r   d   e   f  \r                                
0000010

Существуют различные способы использования tr; нам нужно было передать два параметра - два разных символа - и tr заменит первый параметр вторым. Отправив содержимое файла в качестве ввода для tr '\r' '\n', мы получили следующий результат:

$ tr '\r' '\n' < slashr.txt | od -xc 
0000000      6261    0a63    6564    0a66                                
           a   b   c  \n   d   e   f  \n                                
0000010

Отлично! Теперь мы можем использовать sed:

$ tr '\r' '\n' < slashr.txt | sed 's/^./#/'
#bc
#ef
$ tr '\r' '\n' < slashr.txt | sed 's/^./#/' | od -xc
0000000      6223    0a63    6523    0a66                                
           #   b   c  \n   #   e   f  \n                                
0000010

Но я полагаю, вам нужно использовать \r в качестве разделителя строк, верно? В этом случае просто используйте tr '\n' '\r' для обратного преобразования:

$ tr '\r' '\n' < slashr.txt | sed 's/^./#/' | tr '\n' '\r' | od -xc
0000000      6223    0d63    6523    0d66                                
           #   b   c  \r   #   e   f  \r                                
0000010
0 голосов
/ 03 августа 2011

Насколько я знаю, ты не можешь.Что не так с использованием новой строки в качестве разделителя?Если ваши входные данные имеют окончания строки в стиле DOS \ r \ n, их можно предварительно обработать, чтобы удалить их, а при необходимости их можно вернуть позже.

...