在python控制台中:
print('xx\nyy')
xx
yy
在 bash 控制台中:
echo -e 'xx\nyy'
xx
yy
在 mysql 控制台中:
create database mytest;
use mytest;
CREATE TABLE sample(content VARCHAR(250));
insert into sample(content) values('xx\nyy');
select content from sample;
+---------+
| content |
+---------+
| xx
yy |
+---------+
它们都将 literal 视为 ,\n
而newline
不是 literal \n
。
cat > mytest.txt <<EOF
xx\nyy
EOF
使用vim
或打开 mytest.txt leadpad
,你会发现vim
和leafpad
将文字\n
视为文字\n
,而不是换行符。是否有将文字\n
视为换行符的编辑器工具?
答案1
\n
是 Linux/Unix 表达“换行符”的方式,除非您指的是两个字符\
和n
。这就是通过文本编辑器输入字符序列的方式。如果您希望\n
字符串中有两个字符序列,而不是“换行符”,则必须通过在字符串前面放置一个来转义\
(使字符串\
不特殊)。\
"xx\\nyy"
是 6 个字符串x
, x
, \
, n
, y
, y
。
答案2
TL;DR:将其视为换行符的趋势
\n
并不普遍,当将其视为换行符时,避免这种情况的方法(尤其是最好的“方式”因上下文而异。Shell 实际上并不将其视为换行符,因此使用 时echo
,就不会传递-e
。对于其他语言,请查阅该语言的文档。
这个问题的前提是错误的。\n
在大多数情况下,实际上并不代表换行符。某些编程语言(和数据库查询语言)\n
在某些情况下会进行特殊处理。这种情况相当普遍,但远非普遍。
当\n
被视为表示换行符时,发生这种情况的原因是具体的规则具体的语言,因此没有完全通用的方法来抑制它。特别是,当它根本没有被特殊处理时,试图抑制它通常会导致你不想要的其他东西。在许多情况下,\\n
按照 waltinator 的建议写作会起作用,但在许多其他情况下它不会起作用,即使在它起作用的情况下,它通常也不是表达文字的最清晰或最简单的方法\n
。
尤其,shell 通常不将该序列\n
视为换行符。您可以使用特殊形式的引号让 Bash 执行此操作$'
'
。也就是说,$'\n'
被视为换行符。在 Bash 和其他 Bourne 风格的 shell 中,无论是在单引号还是双引号中,\n
都是保持不变的。
'\n'
变得很简单,因为在你的shell中,在打开--反斜杠之后\n
没有字符被特殊处理,在单引号中永远不会被特殊处理。'
'
"\n"
就只是\n
因为\
选择性地在双引号中特殊处理,但序列\n
没有特殊含义,所以这还没完成。- 在引号之外,
\n
变为简单的n
,因为\
被特殊处理,但是序列\n
没有特殊含义,所以n
在删除引号之后就变成了。
'xx\nyy'
正如您所使用,这是迄今为止xx\nyy
在 Bash 中表达文字字符串的最清晰的方式,因为非常简单的规则是,在开始和结束单引号之间的所有内容都按字面意思处理。我建议不要为此使用任何其他形式的引号。这是可以做到的,但不会改善任何东西。在您的示例中,echo -e
执行转换的是。
您收到换行符的原因echo -e 'xx\nyy'
是:
- shell
\n
按字面意思处理 中的'xx\nyy'
,删除引号后变为xx\nyy
。因此传递给 的第二个参数echo
是xx\nyy
。 echo
由于您传递了选项,因此它本身被\n
视为换行符-e
。如果你不想这样,就不要通过-e
。
我应该指出,它echo
的可移植性不强。原因之一是,echo
在某些系统和某些 shell 中,某些实现会自动像echo -e
在 Ubuntu 中一样运行。(因此,对于脚本,通常最好选择printf
。)但是,echo
在 Ubuntu 上可能使用的实现是 Bash 的echo
内置函数和 GNU Coreutils echo
,它提供了/bin/echo
(在较新的系统上可能被解析为,/usr/bin/echo
其中/bin
和/usr/bin
被合并)。这两个echo
s 的行为都与我描述的一样:除非使用该选项,否则反斜杠序列(例如)将按\n
字面形式打印-e
。
至于\n
您使用哪种编程语言或数据库查询语言,一般答案是您应该查阅该语言的文档。在您的 Python 示例中, in\n
表示'xx\nyy'
换行符。虽然您可以这样写'xx\\nyy'
(Python 确实支持这一点),但通常更清楚的做法是简单地通过添加前缀来抑制所有反斜杠序列,r
使其成为逐字字符串文字:r'xx\nyy'
。