Заменить символы новой строки на буквальные \ n

Этот вопрос имеет ответ, чтобы заменить символы новой строки на sed, используя формат sed ': a; N; $! ba; s / \ n / / g'.

Это работает, но не для специальных символов, таких как \ r, \ n и т. Д.

Я пытаюсь заменить символ новой строки на литерал \ n. Пытался

sed ':a;N;$!ba;s/\n/\\n/g'

а также

sed ':a;N;$!ba;s/\n/\\\n/g'

также

sed ":a;N;$!ba;s/\n/'\'n/g"

но все безрезультатно. Сед продолжает заменять символ новой строки .... символом новой строки.

Мысли?

Отредактировано после первого ответа:

Для полноты работы выполните следующие команды:

PostContent =cat $TextTable | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g'

Где TextTable - это переменная, ссылающаяся на текстовый файл, содержащий выходные данные JSON в следующем формате:

{"posts":[{"title":"mysupertest","slug":"bi-test","markdown":"##TEST
First things first !
To TEST this TEST TEST, click the download button below.
If you need more information about the TEST TEST, you can  read the Table of Contents below.

<a href='/assets/TEST.pdf' style='border-radius:5px; padding: 4px 15px; background-color:#008CBA; color:white; text-decoration:none; float:right;' download> Download </a>


##TEST OF TEST


###TEST TEST PLATFORM TEST GUIDE
WaTESTve TEST SetupTEST
TESTTEST
TESTTESTETESTTETSTTEST
TESTTESTTTETST
TESTTES
TESTTESTESSTSTESTESTTES
TEST","image":"http://localhost:3000/myimage.jpg","featured":false,"page":false,"status":"draft","language":"en_US","meta_title":null,"meta_description":null,"author":"4","publishedBy":null,"tags":[{"uuid":"ember2034","name":"implementation guides","slug":null,"description":null,"meta_title":null,"meta_description":null,"image":null,"visibility":"public"}]}]}
 Ed Morton30 июл. 2016 г., 16:03
Когда вы обнаружите, что пишете / используете такие команды, какsed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g'разве не кажется, что это становится крошечным тайном? Если вы опубликуете краткий, тестируемый пример ввода и ожидаемый результат, я уверен, что кто-то может показать вам, как решить вашу проблему понятным, эффективным, переносимым и легко обслуживаемым способом!

Ответы на вопрос(4)

Это все, что вы пытаетесь сделать?

$ cat file
a
b
c

$ awk '{printf "%s\\n", $0}' file
a\nb\nc\n$

или даже:

$ awk -v ORS='\\n' '1' file
a\nb\nc\n$

Сначала запустите dos2unix для входного файла, чтобы удалить\rЕсли хотите, или используйте-v RS='\r?\n' с GNU awk или dosub(/\r$/,""); перед printf или любым другим из десятка или около того ясных, простых способов справиться с этим.

sed для простых замен в отдельных строках, вот и все. Для всего остального вы должны использовать awk.

 Chen Xie09 апр. 2018 г., 23:08
это работает для меня на MacOS, я пытался добиться того же, чтобы преобразовать файл ключа / pem в один лайнер для JATA DataBag ..
 EugeneRomero14 апр. 2017 г., 00:18
Это идеально подходит, например, для подготовки сертификата SSL для добавления одной строки в пакет данных json. Работал и на MacOS. Upvoted.

Вы можете сделать это, используяsed а такжеtr:

sed 's/$/\\n/' file | tr -d '\n'

Однако это добавит дополнительный\n в конце.

Решение Вопроса

Это должно работать с обоимиLF или жеCR-LF окончания строки:

sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' file
 anubhava30 июл. 2016 г., 13:23
Ты можешь использоватьsed -E ':a;N;$!ba;s/\r{0,1}\n/<br\/>/g' file для использования<br/> в замен.\r{0,1}\n Матчи\r\n или же\n в регулярном выражении
 anubhava27 янв. 2017 г., 16:17
@Niavlys да, это правильно и-E это более портативный вариант, который-r через различные * NIX вкусы.
 Niavlys27 янв. 2017 г., 16:02
Кстати, я задавался вопросом об этом-E вариант, не упомянутый вman sedи оказывается, что это псевдоним для-r опция, которая означает «использовать расширенные регулярные выражения в скрипте».
 anubhava07 авг. 2018 г., 23:26
@ user124384: попробуйте решение awk от Ed
 user12438408 авг. 2018 г., 01:10
@anubhava Я сделал. Это сработало без нареканий.
 anubhava30 июл. 2016 г., 12:35
Можете ли вы опубликовать выводcat -vte file.json в вопросе, а?
 Parze30 июл. 2016 г., 12:37
Неважно, я идиот. Эхо интерпретировало символ новой строки как новую строку. Спасибо за ваш ответ.
 user12438407 авг. 2018 г., 23:22
Это не сработало для меня. Оказалось, не имеет никакого эффекта вообще.
 Parze30 июл. 2016 г., 13:14
Скажем, если бы я захотел заменить его на <BR/>, например, я мог бы адаптировать ваше решение для sed -E ': a; N; $! Ba; s / \ r {0,1} \ n / \ <BR \\\> / g ', если я не ошибаюсь. Не могли бы вы объяснить, как работает ваш код? Я не понимаю первую часть.
 Parze30 июл. 2016 г., 12:22
Спасибо за ответы. К сожалению, у меня такой же результат с помощью этой команды. Я обновил вопрос с более подробной информацией о процессе.
 Niavlys27 янв. 2017 г., 16:00
Вы также можете заменить{0,1} от?Мне это кажется более читабельным.
 anubhava30 июл. 2016 г., 12:37
Вот рабочая демонстрация вышеупомянутой команды - проверить вывод подстандартный вывод раздел.

Вот небольшой скрипт на python для замены '\ r \ n' на '\ r' в каталоге рекурсивным способом import os import sys

if len(sys.argv) < 2:
    print("Wrong arguments. Expected path to directory as arg 1.")
    exit(1)

path = sys.argv[1]


def RecOpOnDir(path, op) :
    for f in os.listdir(path):
        full_f = path + "/" + f
        if os.path.isdir(full_f):
            RecOpOnDir(full_f, op)
        else:
            try:
                op(full_f)
            except Exception as ex:
                print("Exception during proc '", full_f, "' Exception:", ex)

file_counter = 0

def WinEndingToUnix(path_to_file):
    global file_counter
    file_counter += 1
    file_strs = []
    with open(path_to_file) as f:
        for line in f:
            file_strs.append(line.replace(r"\r\n", r"\n"))

    with open(path_to_file, "w") as fw:
        fw.writelines(l for l in file_strs)

try:
    RecOpOnDir(path, WinEndingToUnix)
    print("Completed.", file_counter, "files was reformed")
except Exception as ex:
    print("Exception occured: ", ex)
    exit(1)

Ваш ответ на вопрос