使用字符串文字换行符从文件中分配变量

时间:2016-07-15 05:23:25

标签: json bash amazon-web-services

这个问题可能听起来像是重复的,但我认为它与我发现的页面不同。我正在尝试将文本文件的内容分配给bash变量,但我希望将“\ n”字符作为字符串包含在内,而不是在新行上实际看到它。例如,文件的内容如下所示:

  

以下是文本文件的内容

     

有多行

     blah blah blah

我希望下面的变量“text_file”被分配文件的内容,所以当我在我的脚本中使用它时,它看起来像这样:

  

这是文本文件的内容\ n有多行\ nblah blah blah

我在下面的脚本中使用了这个变量,我收到了这个错误,我认为这是我在分配给变量的“hello.txt”文件中的换行符的结果。

  

解析参数'--message'时出错:无效的JSON:无效的控制字符u'\ n'at:

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 blah@email.com --destination file://destination.json --message file://generated_message.json

我认为我遗漏了一些基本的东西,但我无法弄明白。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

不要尝试使用传统的Unix工具将有效的JSON蹒跚学步;使用专为JSON设计的工具,例如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--slurp确保hello.txt的内容直接传递给@text函数,以确保文本被正确引用为JSON字符串。将消息和主题作为变量传递,而不是将它们直接嵌入到过滤器参数中,确保它们也能正确地进行JSON编码。

答案 1 :(得分:0)

text_file 的内容:

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

预期ouptut

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

你可以做

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"

实际输出

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