2013-05-02 49 views
3

鑑於此文件UNESCAPE與管

$ cat foo.txt 
\"That's funny, haha\" 

我能反轉義與read

$ read bar < foo.txt 

$ echo $bar 
"That's funny, haha" 

但是雙引號可以將此與管道做什麼?類似於

cat foo.txt | unescape 

回答

6

這似乎做

sed -r 's/\\(.)/\1/g' 
+3

在Mac OS X上,它是'-E'而不是'-r' – max 2015-04-19 15:22:35

+3

這隻適用於像空格,反斜槓等轉義的ascii字符。如果它轉義換行符,製表符或unicode值不起作用 – EkriirkE 2015-10-12 06:17:21

2

是或否,具體取決於您的問題。管道不能刪除反斜槓,但是,正如你所看到的,read可以:

cat foo.txt | read bar 

這一點,雖然,一個沒用使用的cat,它不會做你的需要呢。

在Bash中,這增加了一個「特徵」,管道的每一側都在它自己的過程中運行。這意味着變量(bar)在調用過程中將不可用。所以,反斜槓將被刪除,但它不會對你有一點好處。

是的,你可以圖謀捕捉到它:

bar=$(cat foo.txt | { read bat;echo $bat;}) 

但是,這不只是慘不忍睹,這是低效的,因爲好。

堅持重定向。

0

這是一個老問題了,但這樣它在這裏,因爲我有同樣的問題,我會添加這個答案備案,但沒有找到一個解決方案任何地方。我想出了這個解決方案,適用於任何字符串轉義序列:

echo "" | gawk "{ print \"\`cat foo.txt\`\" }" 

echo "" | gawk "{ print \"$(cat foo.txt)\" }" 

echo "" | gawk "{ print \"$(< foo.txt)\" }" 

他們是相同的操作的所有變體,並注意在第一個使用反引號的。他們正在利用gawk的print命令完成的操作,並且僅限於單行輸入文件(儘管我確信可以爲多行輸入制定更復雜的變體)。

請注意,我認爲可能是一個解決方案的cat foo.txt | gawk '{ printf $0 }'不起作用 - 看起來gawk並沒有忽略它的輸入,即使它被用作printf格式的字符串,否則它就會失敗。