在bash linux中如何回显转义文本作为命令的输出

时间:2016-03-04 00:07:49

标签: bash text escaping echo

我想打印一个文字示例

 '(]\{&}$"\n

我拥有的转义版本是:

"'(]\\{&}$\"\\n"

我尝试了以下内容:

cat $CLIPBOARD_HISTORY_FILE | sed "$2!d" |  sed 's/^.\(.*\).$/\1/'
cat $CLIPBOARD_HISTORY_FILE | sed "$2!d" |  sed 's/^.\(.*\).$/\1/'  | eval 'stdin=$(cat); echo  "$stdin"'
VAR1=$(cat $CLIPBOARD_HISTORY_FILE | sed "$2!d" |  sed 's/^.\(.*\).$/\1/')
VAR2="'(]\\{&}\$\"\\n"
VAR3=$VAR1
echo "1  '(]\\{&}\$\"\\n"
echo "2  $VAR1"
echo "3  $VAR2"
echo "4  $VAR3"
echo -e "5  $VAR1"
echo -e "6  $VAR2"
echo -e "7  $VAR3"


$ 
'(]\\{&}$\"\\n
'(]\\{&}$\"\\n
1  '(]\{&}$"\n
2  '(]\\{&}$\"\\n
3  '(]\{&}$"\n
4  '(]\\{&}$\"\\n
5  '(]\{&}$\"\n
6  '(]\{&}$"

7  '(]\{&}$\"\n

直接回复文本是有效的,但如果它来自一个命令,那就不行了......我没有看到或理解什么? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

一般来说,最好将材料用单引号而不是双引号括起来;那么你只需要担心单引号。因此:

$ x="'"'(]\{&}$"\n'
$ printf "%s\n" "$x"
'(]\{&}$"\n
$ printf "%s\n" "$x" | sed -e "s/'/'\\\\''/g" -e "s/^/'/" -e "s/$/'/"
''\''(]\{&}$"\n'
$

使用printf很重要;与echo不同,它的数据并不充实。 '\''序列至关重要;它会停止当前单引号字符串,输出单引号然后重新启动单引号字符串。该输出是次优的&#39 ;;最初的''可以省略(类似地,如果数据以单引号结尾,则可以省略最终的''):

$ printf "%s\n" "$x" | sed -e "s/'/'\\\\''/g" -e "s/^/'/" -e "s/$/'/" -e "s/^''//" -e "s/''$//"
\''(]\{&}$"\n'
$

如果你真的必须在数据周围加双引号,而不是单引号,那么你必须逃避更多($`\"需要保护),但概念是相似的。