我想打印一个文字示例
'(]\{&}$"\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
直接回复文本是有效的,但如果它来自一个命令,那就不行了......我没有看到或理解什么? 谢谢你的帮助!
答案 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'
$
如果你真的必须在数据周围加双引号,而不是单引号,那么你必须逃避更多($`\"
需要保护),但概念是相似的。