?
?回車和換行關(guān)于“回車”(carriage return)和“換行”(line feed)這兩個概念的來歷和區(qū)別。
在計算機還沒有出現(xiàn)之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。
于是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結(jié)束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。
這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。
后來,計算機發(fā)明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學(xué)家認為在每行結(jié)尾加兩個字符太浪費了,加一個就可以。于是,就出現(xiàn)了分歧。
Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“/n”;Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車>”,即“/r/n”;Mac系統(tǒng)里,每行結(jié)尾是“/r”。
一個直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,在每行的結(jié)尾可能會多出一個^M符號。
Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車>”,即“/r/n”————此處有誤,恰好將順序顛倒了,從下面可以例子看出來。
下面在Linux中看看實際操作的效果。
先生成一個換行(/n, 0x0A)和回車(/r, 0x0D)組合的文本
$ echo -en '12/n34/r56/n/r78/r/n' > tmp
以十六進制方式查看文本
$ od -t x1 tmp
0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a
0000016
在Linux的vim中的顯示效果
在windows的記事本中的顯示效果
可見Linux中遇到換行符會進行回車+換行的操作,回車符反而只會作為控制字符顯示,不發(fā)生回車的操作。而windows中要回車符+換行符才會回車+換行,缺少一個控制符或者順序不對都不能正確的另起一行。
?
?
?
?
2.利用sed 命令去掉windows下回車符及空白符
windows下的回車符為 /r/n?? 而unix下的回車符是 /n
1.去掉所有行的空格
sed? -i 's/ //g'?? df.txt
2.去掉所有行的空格
sed? -e 's/ //g'?? df.txt? >cwm.txt
?
3.將每一行拖尾的“空白字符”(空格,制表符)刪除
sed 's/ *$//'? df.txt?? >cwm.txt
?
4.將每一行中的前導(dǎo)和拖尾的空白字符刪除
sed 's/^ *//;s/ *$//'? df.txt?? >cwm.txt
?
5.去掉空行
sed??? '/^$/d' df.txt? >cwm.txt
sed -e '/^$/d' df.txt? >cwm.txt
sed -i '/^$/d' df.txt?
這三個是等價的 但第三個會改變原文件
?
6.去掉windows下的回車符 (注意^M 在linux 下寫法 按^M 是回車換行符,輸入方法是按住CTRL+v,松開v,按m)
sed? -i 's/^M//g'? df.txt??
?
7.去掉windows下的回車符 (注意^M 在linux 下寫法 按^M 是回車換行符,輸入方法是按住CTRL+v,松開v,按m)
sed? -e 's/^M//g'? df.txt? >cwm.txt
? 8.sed 用正則表達式? 8個字符一組換行
echo "aaaaaaaabbbbbbbbccccccccdddddddd"|sed 's/./{8/}/&/n/g'
aaaaaaaa
??????? bbbbbbbb
???????? cccccccc
??????? dddddddd
?
也等價于
dos2unix df.txt? >cwm.txt?
?
?
----------------------------------------------------------------------------------------------
******如何去掉文件中行尾的回車符號^M******
sed 's/^M//g w newfilename' oldfilename
其中:
s? 表示Searchg 表示搜索全文,缺省是搜索第一個^M 是回車換行符,輸入方法是按住CTRL+v,松開v,按m?
w? 表示寫到新文件中.
?
?
例子1
86103113234778,
86103145878770,
86103116778768,
86103111879708, sed 's/^86//;s/,$//' user.txt???? #去掉開頭的86 及尾部的,號
例子2
103113234778
103145878770
103116778768
103111879708
sed -e 's/^/86/'??? user.txt????? #每行行首加上86
86103113234778
86103145878770
86103116778768
86103111879708
------------------------------------------------------------------
我有一個文件:
aaa,
bbb,
ccc,
ddd,
eee,
fff,
想刪除第3,6,9。。。的空行并且合并12,45,78。。。行,
結(jié)果如下:
aaa,bbb,
ccc,ddd,
eee,fff,
.......
解法
sed -e '/^$/d' -e 'N;s//n//g'
或
sed 'N;N;s//n//g' (行數(shù)必須是3的倍數(shù),不然最后一行不對)
對于替換單引號外層應(yīng)加雙引號