在Bash中使用printf打印反斜杠并换行。

3

我正在尝试将这个从bash转换成C头文件

#define XXXXX \

 "id title\n" \ 

 "1  developer\n" \

the script is 

FORMAT="  \"%-4s  %-32s\\\n"

printf "$FORMAT" "id" "title\\n\"" >> $FILE

printf "$FORMAT" "1" "Developer\\n\"" >> $FILE

结果将会是:
"id    title\n"                        \n  "1     Developer\n"                              \n

当我改变FORMAT="%-4s %-32s \\ \n"时,
我得到了:
"id    title\n"                           \ 
"1     Developer\n"                       \ 

gcc开始抱怨在\后面有额外的空格。

如果没有空格,似乎\\会被解释多次。

不使用FORMAT="%-4s %-32s \\"

printf "$FORMAT" "id" "title\\n\"" >> $FILE

printf "\n" >> $FILE
...

有没有更好的方法来处理这个问题?
2个回答

3

使用十六进制转义序列:

FORMAT="%-4s %-32s \x5C\n"

谢谢,这个可行。问题可能有点分散注意力,但问题在于如何输出一个反斜杠,然后跟着一个换行符。 - xsong

0

Shell对双引号和单引号的处理方式不同。

这里不要使用双引号:

FORMAT="%-4s %-32s \\n"

像这样使用单引号,并避免转义:

FORMAT='%-4s %-32s \n'

或者用于打印字面上的反斜杠和换行符:

FORMAT='%-4s %-32s \\\n'

谢谢您的快速回复,但我仍需要在文件中生成反斜杠,并且我更喜欢在反斜杠后没有空格,以避免编译器警告。 - xsong
我刚刚更新了这篇文章,输出格式是用于宏定义的,如 "#define xxxxx {newline} "id name\n" {newline} "1 me\n" {newline}。 - xsong
不用谢,希望这些示例能让您清楚地了解转义和回显反斜杠在shell中的工作原理。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接