如何打印存储在TCL变量中的“\n”

How to print "\n" stored in variable in TCL

提问人:notatclgenius 提问时间:11/4/2023 更新时间:11/4/2023 访问量:59

问:

我有一个由用户设置的变量,假设 a 是“/n/nhelloworld”,我不希望“\n”创建新行,而是打印它。

基本上,对于没有格式的变量值的输出,只有原始文本。

因为它存储在变量中并由用户设置,所以我不能使用 {} 而不是“”,或者至少我尝试过但没有用

壳牌 TCL集团

评论

0赞 glenn jackman 11/4/2023
你是说吗?lets say a is "\n\nhelloworld"

答:

3赞 dana 11/4/2023 #1

您可以直接转义反斜杠,如下所示:

set a "\n\nhelloworld"
set b [string map {"\n" "\\n"} $a]

然后打印$b

评论

0赞 dana 11/4/2023
这只是一个例子,如果正如你所说,$<var> 已经由另一个用户设置了 eq “\n\nhelloworld”,它当然仍然以同样的方式工作
0赞 Donal Fellows 11/4/2023
还要记住,您可以在同一个通话中同时做很多事情。这简化了将换行符转换为换行符和反斜杠同时转换为 \\ 之类的操作。string map\n
0赞 Cyan Ogilvie 11/4/2023 #2

如果文字字符序列在变量中,则打印出来的内容 - 输出值时不执行替换。反斜杠替换(即将 2 个字符的序列转换为代码点 10:换行符)仅在解析 Tcl 脚本中的文本值时发生;通过命令 unless 给出,以及带引号的字符串中的命令(或其他将其参数视为表达式的命令:、、等)。\nputs\nsubst-nobackslashesexprifwhilefor

set msg [format hello%cnworld 0x5C]   ;# codepoint 0x5C is backslash
puts $msg                             ;# prints "hello\nworld"

# Show the hex values of all the bytes of the UTF-8 string
# to prove that the sequence "\n" (0x5C 0x6E) is in the value
puts [regexp -all -inline .. [binary encode hex [encoding convertto utf-8 $msg]]]

如果您从用户那里收到包含序列的字符串,但该字符串显示为换行符,则几乎可以肯定存在远程代码执行漏洞(由用户提交的值经历解析和替换阶段引起,其中可能包括脚本替换 - 用户提供的任何代码都将运行)。检查没有大括号的表达式,s 等。\neval