2013-06-03 78 views
11

可以使用轉義字符(\)來逃避行尾,例如,行尾(新行)在bash中逃脫

% echo This could be \ 
a very \ 
long line\! 
This could be a very long line! 
% 

然而,沒有結束通過\n具有兩個字符表示線(換行)的。不應該逃避的結果是文字\n。例如

%echo $'\\n' 
\n 
% 

謝謝你的回答!

編輯: 對不起,我沒有解釋得很好。我不是想回應一個新的路線。我想知道爲什麼\能夠換行符(\n),它具有兩個字符,而不是隻是在新行字符中跳過反斜槓,並生成文字\ n

+0

http://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting –

+8

嗯,仍然不知道我明白你的問題。也許這將有助於知道'\ n'不是一個換行符 - 它是一個轉義序列,代表一個換行符(這只是Linux中的一個字符)。在行末尾的'\'可以使用'enter'鍵輸入_actual_換行符。 –

+0

@MarkkuK,謝謝!這實際上回答了我的問題。我一直認爲'\ n'是它自己的新字符。這就是爲什麼我不明白爲什麼反斜槓可以逃脫兩個字符。對不起的措辭感到抱歉。 – Yoland

回答

16

其實,\n是不是真的一個換行符 - 這是一個轉義序列代表換行(這是Linux的一個字符)。在行末尾的\會跳過您使用Enter鍵輸入的實際換行符。你可以看一下ASCII值表示使用hexdump不同的字符:

%echo $'\\n' 
\n 
%echo $'\\n' | hexdump -C 
00000000 5c 6e 0a     |\n.| 
00000003 

你會發現,回聲打印出3個字符:\(5C),n(6E)和一個換行符(0A)。您還會注意到,在hexdump輸出的右側,換行符顯示爲「。」,因爲它被認爲是non-printing character

1

換行符是UNIX世界中給出的名稱,在面向行的文件(或終端)中結束一行的字符。在UNIX/Linux世界中,這對應於ASCII換行字符。

不同的系統使用不同的約定來結束行:Windows使用一系列回車和換行符,而Mac最初使用一個回車符。這種混淆源於這樣的事實:這些原本是將打印機的打印頭移動到新行開始時所需的命令。

\n是一種在代碼中表達行尾字符的常規方式,也是最初在UNIX世界中,更確切地說是在C語言中。請注意,在讀取文本文件時,即使在系統中這是一個雙字符序列,C也會讀取一個換行符。

+0

在UNIX中,如果換行符是2個字符,則C(或更精確地說,fread)讀取2個字符。在Windows上,如果文件以文本文件的形式打開,則該庫會將\ r \ n序列轉換爲\ n。否則,即使在Windows上,2個字符也會被讀取。 – martinkunev

+0

在UNIX中,換行符是一個定義的字符,它是ASCII換行符或其他字符集中的對應字符。確實,換行和回車的順序是按原樣讀取的,沒有翻譯。 –