2016-07-15 4 views
0

Diese Frage klingt wie ein Duplikat, aber ich denke, es ist anders als die Seiten, die ich gefunden habe. Ich versuche, den Inhalt einer Textdatei einer bash-Variablen zuzuordnen, aber ich möchte, dass das "\ n" -Zeichen als String eingefügt wird, anstatt es tatsächlich in einer neuen Zeile zu sehen. Zum Beispiel sehen die Inhalte der Datei etwas wie folgt aus:Zuweisen von Variablen aus Datei mit Zeichenfolgenliteral newline

Hier ist der Inhalt der Textdatei

Es gibt mehrere Zeilen

blablabla

Ich möchte die Variable "text_file" unten, um den Inhalt der Datei zugewiesen zu bekommen, so dass es aussieht, wenn ich es in meinem Skript verwende:

Hier ist der Inhalt der Textdatei \ nEs mehrere Zeilen sind \ nbla bla bla

ich diese Variable im folgenden Skript bin mit, und ich diesen Fehler, die ich glaube, das Ergebnis ist der Newline-Zeichen in der Datei "hello.txt", die ich der Variablen zuweise.

Fehler beim Parsen der Parameter '--message': ungültiger JSON: Ungültige Steuerzeichen u '\ n' an:

subject="Test Email Sent Via AWS" 
message="here is the message to the user...\n\n" 
text_file=`cat hello.txt` 
full_message="$message$text_file" 

cat <<EOF > generated_message.json 
{ 

    "Subject": { 
     "Data": "$subject", 
     "Charset": "UTF-8" 
    }, 
    "Body": { 
     "Text": { 
      "Data": "$full_message", 
      "Charset": "UTF-8" 
     } 
    } 
} 
EOF 
aws ses send-email --profile sendmail --from [email protected] --destination file://destination.json --message file://generated_message.json 

Ich glaube, ich etwas Grundsätzliches fehlt bin, aber ich kann‘ t es herausfinden. Vielen Dank im Voraus für die Hilfe.

+0

Ich glaube nicht, dass dies notwendigerweise eine doppelte Frage ist, obwohl es mir einige zusätzliche Informationen darüber gibt, was das Problem verursachen könnte. Wenn ich also die Antworten in diesem Beitrag richtig verstehe, können Sie in JSON überhaupt kein "\ n" -Zeichen haben und es muss mit einem zusätzlichen Backslash versehen werden. Wenn dies der Fall ist, bedeutet das, dass ich alle meine Newline-Zeichen im Original "Hallo" ersetzen muss.txt "file with" \\ n "zu lösen? – syang

Antwort

1

Versuchen Sie nicht, gültiges JSON unter Verwendung herkömmlicher Unix-Tools zu humpeln; Verwenden Sie ein für JSON entwickeltes Werkzeug wie jq.

subject="Test Email Sent Via AWS" 
message="here is the message to the user..." 

jq -R --slurp \ 
    --arg message "$message" \ 
    --arg subject "$subject" '{ 
     "Subject": { 
      "Data": $subject, 
      "Charset": "UTF-8" 
     }, 
     "Body": { 
      "Text": { 
       "Data": ($message + "\n\n" + @text), 
       "Charset": "UTF-8" 
      } 
     } 
    }' <hello.txt> generated_message.json 

-R und --slurp sicherzustellen, dass die Inhalte von hello.txt direkt an die @text Funktion übergeben werden, die den Text gewährleistet wird korrekt als JSON-String zitiert. Wenn Sie die Nachricht und den Betreff als Variablen übergeben, anstatt sie direkt in das Filterargument einzubetten, wird sichergestellt, dass sie ebenfalls ordnungsgemäß JSON-codiert sind.

0

Inhalt von text_file:

Here is the content of the text file 
There are multiple lines 
blah blah blah 

Erwartet ouptut

Here is the content of the text file\nThere are multiple lines\nblah blah blah 

Sie könnten

declare -a file_as_array 
while read line 
do 
file_as_array+=("${line/%/\\n}") 
done<text_file 
file_as_text="$(sed 's/\\n /\\n/g' <<<"${file_as_array[@]}")" 
unset file_as_array 
echo "$file_as_text" 

tatsächliche Ausgabe

tun 10
Here is the content of the text file\nThere are multiple lines\nblah blah blah\n 
+0

Was ist mit der indirect über ein Array? Nur' file_as_text = $ (perl-pe 's/\ n/\\ n /' text_file) 'sollte Sie das bekommen. – tripleee

Verwandte Themen