打印一个字符串,其特殊字符打印为文字转义序列
Print a string with its special characters printed as literal escape sequences
我在 shell/bash 脚本中有一个字符串。我想打印字符串及其所有 "special characters" (例如换行符、制表符等)打印为文字转义序列(例如,换行符打印为 \n
,制表符打印为 \t
,依此类推)。
(不确定我是否使用了正确的术语;这个例子应该能澄清一些事情。)
例子
期望的输出...
a="foo\t\tbar"
b="foo bar"
print_escape_seq "$a"
print_escape_seq "$b"
...是:
foo\t\tbar
foo\t\tbar
$a
和 $b
是从文本文件中读入的字符串。
$b
变量中 foo
和 bar
之间有两个制表符。
一次尝试
这是我试过的:
#!/bin/sh
print_escape_seq() {
str=$(printf "%q\n" )
str=${str/\/\//\/}
echo $str
}
a="foo\t\tbar"
b="foo bar"
print_escape_seq "$a"
print_escape_seq "$b"
输出为:
foo\t\tbar
foo bar
因此,它不适用于 $b
。
是否有我完全错过的完全直接的方法来完成此操作?
您需要为要替换的每个二进制值创建一个搜索和替换模式。像这样:
#!/bin/bash
esc() {
# space char after //
v=${1// /\s}
# tab character after //
v=${v// /\t}
echo $v
}
esc "hello world"
esc "hello world"
这输出
hello\sworld
hello\tworld
Bash 有一个字符串引用操作 ${var@Q}
这是一些示例代码
bash_encode () {
esc=${1@Q}
echo "${esc:2:-1}"
}
testval=$(printf "hello\t\tworld")
set | grep "^testval="
echo "The encoded value of testval is" $(bash_encode "$testval")
这是输出
testval=$'hello\t\tworld'
The encoded value of testval is hello\t\tworld
我在 shell/bash 脚本中有一个字符串。我想打印字符串及其所有 "special characters" (例如换行符、制表符等)打印为文字转义序列(例如,换行符打印为 \n
,制表符打印为 \t
,依此类推)。
(不确定我是否使用了正确的术语;这个例子应该能澄清一些事情。)
例子
期望的输出...
a="foo\t\tbar"
b="foo bar"
print_escape_seq "$a"
print_escape_seq "$b"
...是:
foo\t\tbar
foo\t\tbar
$a
和$b
是从文本文件中读入的字符串。$b
变量中foo
和bar
之间有两个制表符。
一次尝试
这是我试过的:
#!/bin/sh
print_escape_seq() {
str=$(printf "%q\n" )
str=${str/\/\//\/}
echo $str
}
a="foo\t\tbar"
b="foo bar"
print_escape_seq "$a"
print_escape_seq "$b"
输出为:
foo\t\tbar
foo bar
因此,它不适用于 $b
。
是否有我完全错过的完全直接的方法来完成此操作?
您需要为要替换的每个二进制值创建一个搜索和替换模式。像这样:
#!/bin/bash
esc() {
# space char after //
v=${1// /\s}
# tab character after //
v=${v// /\t}
echo $v
}
esc "hello world"
esc "hello world"
这输出
hello\sworld
hello\tworld
Bash 有一个字符串引用操作 ${var@Q}
这是一些示例代码
bash_encode () {
esc=${1@Q}
echo "${esc:2:-1}"
}
testval=$(printf "hello\t\tworld")
set | grep "^testval="
echo "The encoded value of testval is" $(bash_encode "$testval")
这是输出
testval=$'hello\t\tworld'
The encoded value of testval is hello\t\tworld