web-dev-qa-db-fra.com

Remplacer les nouvelles lignes par du littéral\n

Cette question de stackoverflow a une réponse pour remplacer les nouvelles lignes par sed, en utilisant le format sed ': a; N; $! Ba; s/\ n// g'.

Cela fonctionne, mais pas pour les caractères spéciaux comme\r,\n, etc.

Ce que j’essaie de faire, c’est de remplacer le caractère de nouvelle ligne par un littéral\n . 

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

et 

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

également

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

mais tout en vain. Sed continue de remplacer le caractère de nouvelle ligne .... par un caractère de nouvelle ligne.

Pensées?

Edité après la première réponse:

Par souci d’exhaustivité, les commandes exécutées sont les suivantes:

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

Où TextTable est une variable liant un fichier texte contenant une sortie JSON au format suivant:

{"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"}]}]}
26
Parze

Cela devrait fonctionner avec les deux fins de lignes LF ou CR-LF:

sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' file
19
anubhava

Est-ce tout ce que vous essayez de faire?

$ cat file
a
b
c

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

ou même:

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

Commencez par exécuter dos2unix sur le fichier d’entrée pour supprimer le \rs si vous le souhaitez, ou utilisez -v RS='\r?\n' avec GNU awk ou effectuez sub(/\r$/,""); avant le printf ou tout autre moyen parmi une douzaine de façons simples de le gérer.

sed est pour de simples substitutions sur des lignes individuelles, c'est tout. Pour toute autre chose, vous devriez utiliser awk.

51
Ed Morton

Vous pouvez le faire en utilisant sed et tr:

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

Cependant, ceci ajoutera un \n supplémentaire à la fin.

5
mvr

Voici un petit script python pour remplacer le '\ r\n' par '\ r' dans le répertoire de manière récursive import os système d'importation

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)
0
voltento