2016-03-04 29 views
0

我想打印文本例如在bash Linux下如何呼應逃脫文本作爲一個命令

'(]\{&}$"\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

一般來說,最好用單引號而不是雙引號括起材料;那麼你只需要擔心單引號。因此:

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

使用printf是重要的;它不會與其數據相悖,不像echo'\''序列至關重要;它會停止當前單引號字符串,輸出單引號,然後重新啓動單引號字符串。該輸出是「次優」的;初始''可能被排除在外(以及類似最終''可能被排除在外,如果數據以一個單引號結束):

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

如果你真的必須圍繞數據雙引號,而不是單引號,那麼你必須逃避更多($`\"需要保護),但概念是相似的。

+0

謝謝。問題是,我所擁有的轉義文本是由另一個我不知道的ruby腳本生成的,所以我希望能找到一種方法來轉換我得到的輸入。當我使用printf的時候,我在某些情況下收到了錯誤消息,包括\,%或',我需要像\ n這樣的元素被解釋爲一個新行,因此使用雙引號......但我會更詳細地嘗試您的示例不久 – phil