string - 在 bash 的字符串中“揭示”隐藏/控制 'codes'

标签 string bash shell quoting ansi-c

Python 中有一个非常方便的函数:repr()当应用于包含空白字符的字符串时,将打印出该字符串的表示,不会导致对字符串实际内容的任何人为误解。

例如:

$ python -c "print repr(r'''abcde\rfghi\tjklmn\nopqr\bstuv\fwxyz''')"
'abcde\\rfghi\\tjklmn\\nopqr\\bstuv\\fwxyz'

我如何在 bash 中用 printf 做同样的事情? ?

我正在寻找的完美工具/技巧就是打印

'abcd\refjh\bijk'

命令

printf "abcd\refjh\bijk" | <something>

这背后的目的是改进打印两个字符串之间差异的测试工具:

http_response_code=$(curl -s --head http://httpbin.org/ | head -1)  # will put "HTTP/1.1 200 OK\r" in $http_response_code
assert_equal "HTTP/1.1 200 OK" "$http_response_code"
> failed: strings do not match
> expected:   'HTTP/1.1 200 OK'
> actual:     'HTTP/1.1 200 OK'

正如您所看到的,当前的实现让用户对失败的原因一无所知并且非常困惑。

理想情况下,我希望得到以下输出:

> failed: strings do not match
> expected:   'HTTP/1.1 200 OK'
> actual:     'HTTP/1.1 200 OK\r'

当前尝试:

  • printf $'\a\b\e\E\f\n\r\t\v\\\'\"' | cat -A
  • echo $'\a\b\e\E\f\n\r\t\v\\\'\"' | cat -A | sed -r '$!{ N;s/\$\n/\\n/;t sub-yes;:sub-not;P;D;:sub-yes;}'
  • printf $'\a\b\e\E\f\n\r\t\v\\\'\"' | od -c

最佳答案

%q 格式说明符接近您的理想输出:

$ printf '%q' "abcd\refjh\bijk"
abcd\\refjh\\bijk

这会输出一个与你的想法等价的字符串;例如,shell 将 '\r'\\r 完全相同。还有,

$ printf '%q' $'\a\b\e\E\f\n\r\t\v\\\'\"'
$'\a\b\E\E\f\n\r\t\v\\\'"'

输出使用 ANSI 引号格式显示包含实际不可打印字符的字符串。

要对仅包含可打印字符的字符串强制使用 ANSI 引号,您可以将不可打印的字符添加到字符串的末尾,对其进行格式化,然后去除添加的字符。

$ var="My string"
$ printf -v var '%q' "$var"$'\n'   # Add a newline
$ [[ $var =~ \$\'(.*)\\n\' ]] && var="\$'${BASH_REMATCH[1]}'"
$ echo "$var"

关于string - 在 bash 的字符串中“揭示”隐藏/控制 'codes',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543371/

相关文章:

string - 尝试用 VBA 代码编写(小数)的幂

shell - sqlite 触发器输出

linux - 在命令结果末尾添加计算列

bash - 使用 'time' 在 bash 中计时并发进程

regex - 在 Bash 正则表达式中, `^` 和 `$` 是指行还是整个字符串?

linux - 将路径列表中的文件粘贴到单个输出文件中

linux - bash 执行代码在执行 ' sudo -i' 后停止

java - 如何找到给定字符串中最长的单词?

c - 如何在 C 中的字符串文字中存储私钥?

Java Regex 在定界符和保留定界符之间拆分字符串