2015-02-25 4 views
-1

Я пытаюсь заменить возврат каретки в конец предыдущей строки. ^ M - возврат каретки.sed: совпадающий шаблон до конца предыдущей строки

Пример:

hello 
hello 1^M 
hello 2^M 
hello 3^M 
hello 4^M 
hello 5^M 
hello 6 

Что мне нужно:

hello 
hello 1 hello 2 hello 3 hello 4 hello 5 
hello 6 

Я хочу, чтобы все^M заменить на конец предыдущей строки без^М. Есть ли у вас какие-либо идеи. Как его заменить?

Это моя команда:

sed -i 's/^M//g' filtest.txt 
sed -i ':a;N;$!ba;s/\n//g' filtest.txt 

Результат:

hellohello 1hello 2hello 3hello 4hello 5hello 6 

Спасибо за помогает! :)

+0

Как вы должны сказать от входа, что вы хотите здесь? Или вам нужно жестко закодировать это, потому что нет способа рассказать? –

+1

Почему вы ожидаете замены только первого '^ M'? – hek2mgl

+0

Что алгоритм, который диктует, что '\ r \ n' в конце' hello5' должен только удалить его '\ r', и это' \ n' остается, в то время как предыдущие 4 строки получают свой полный '\ r \ n' удален? –

ответ

0

Это будет делать то, что он выглядит, как вы хотите, используя GNU AWK для мульти символьных RS, и третий аргумент, чтобы соответствовать():

$ gawk -v RS='^$' -v ORS= '{ 
    match($0,/\r.*\r/,a) 
    gsub(/\r(\n|$)/,"",a[0]) 
    print substr($0,1,RSTART-1) a[0] substr($0,RSTART+RLENGTH) 
}' file 
hello 
hello 1hello 2hello 3hello 4hello 5 
hello 6 
+1

Большое спасибо. Оно работает. – Skydreampower