6

Python には非常に便利な関数repr()があり、空白文字を含む文字列に適用すると、その文字列の表現が出力され、文字列の実際の内容を人間が誤解することはありません。

例えば:

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

printfを使用して bash で同じことを行うにはどうすればよいですか?

私が探している完璧なツール/トリックは、文字通り印刷されます

'abcd\refjh\bijk'

コマンドの

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

この背後にある意図は、2 つの文字列の違いを出力するテスト ツールを改善することです。

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
4

1 に答える 1

6

フォーマット指定子は、%q理想的な出力に近づきます。

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

これにより、アイデアと同等の文字列が出力されます。たとえば、シェルは'\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"
于 2015-09-12T22:30:31.273 に答える