我在shell / bash脚本中有一个字符串。我想打印字符串及其所有#34;特殊字符" (例如换行符,制表符等)打印为文字转义序列(例如,换行符打印为\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
是从文本文件中读取的字符串。foo
变量中的bar
和$b
之间有两个制表符。这是我尝试过的:
#!/bin/sh
print_escape_seq() {
str=$(printf "%q\n" $1)
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
。
是否有一种完全错过的完全错过的方法?
答案 0 :(得分:3)
您需要为要替换的每个二进制值创建搜索和替换模式。像这样:
#!/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