打印一个字符串,其特殊字符打印为文字转义序列

时间:2015-01-18 17:41:04

标签: bash shell

我在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
  1. $a$b是从文本文件中读取的字符串。
  2. foo变量中的bar$b之间有两个制表符。
  3. 尝试

    这是我尝试过的:

    #!/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

    是否有一种完全错过的完全错过的方法?

1 个答案:

答案 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