2014-06-09 59 views
1
#!/bin/ksh 

FILE_NAME=pltlog.20130801152242 
LINE_NOS=`grep -n "SEND MSEG" $FILE_NAME|awk -F: '{print $1}'` 
sed -n "1,52p" $FILE_NAME 
echo "This is a test" 

#for start_line in $LINE_NOS 
#do 
# ((end_line=start_line+51)) 
# sed -n "$start_line, ${end_line}p" $FILE_NAME |grep "<"|grep -v "RECV MESG" |sed 's/^\[[^<]*</</' 
# echo 
#done 

我只是寫了這些代碼來抓取一些xml,但總是有^ M的重定向結果文件(所有行,但回顯行)。經過大量時間的實驗後,'回聲'似乎是問題,沒有回聲,一切都很好。在Mac OS X 10.9和Ubuntu 12.04相同的結果,這裏是結果文件中的內容:msg.sh>結果爲什麼在sed後回顯使其他行以^ M結尾

[  ] 15:22:42:150 esbclient_send.c:326 PID:4980956 TID:0 SID:759506   [DEBUG]SMSP: SEND MSEG: [<?xml version="1.0" encoding="UTF-8"?>^M 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">^M 
    <soapenv:Body>^M 
    <p0:sendSMS xmlns:p2="http://esb.xxxx.com" xmlns:p1="http://smsp.service.xxxx.com/abstraction/atomic/business.SmsSendService/schema/v1" xmlns:p0="http://smsp.service.xxxx.com/abstraction/atomic/business.SmsSendService/v1">^M 
     <p2:requestHeader>^M 
     <p2:version>1.0</p2:version>^M 
     <p2:serialNo>783300013080100000000000003276500000</p2:serialNo>^M 
     <p2:refSerialNo></p2:refSerialNo>^M 
     <p2:requestId></p2:requestId>^M 
     <p2:requestTime></p2:requestTime>^M 
     <p2:timeOutTime></p2:timeOutTime>^M 
     <p2:channelId></p2:channelId>^M 
     <p2:channelSerialNo>783300013080100000000000003276500000</p2:channelSerialNo>^M 
     </p2:requestHeader>^M 
     <p1:msgID>0043559765</p1:msgID>^M 
     <p1:phoneNum></p1:phoneNum>^M 
     <p1:msgContent></p1:msgContent>^M 
     <p1:bizKind></p1:bizKind>^M 
     <p1:msgContent></p1:msgContent>^M 
     <p1:bizKind></p1:bizKind>^M 
     <p1:bizSys>330</p1:bizSys>^M 
     <p1:bizCode>37371</p1:bizCode>^M 
     <p1:dtSent></p1:dtSent>^M 
     <p1:bizOrgan></p1:bizOrgan>^M 
     <p1:bizTotal></p1:bizTotal>^M 
     <p1:cardAccount></p1:cardAccount>^M 
     <p1:bankBook>6216882031000005888</p1:bankBook>^M 
     <p1:subAccount></p1:subAccount>^M 
     <p1:dtBiz>20131011</p1:dtBiz>^M 
     <p1:tmBiz>152052</p1:tmBiz>^M 
     <p1:dtYear></p1:dtYear>^M 
     <p1:dtMon></p1:dtMon>^M 
     <p1:dtDay></p1:dtDay>^M 
     <p1:dtHour></p1:dtHour>^M 
     <p1:dtMin></p1:dtMin>^M 
     <p1:bizTime>20130801152242</p1:bizTime>^M 
     <p1:productName>SS1012</p1:productName>^M 
     <p1:oldBalance></p1:oldBalance>^M 
     <p1:moneyOut></p1:moneyOut>^M 
     <p1:moneyIn></p1:moneyIn>^M 
     <p1:balance></p1:balance>^M 
     <p1:moneyIn></p1:moneyIn>^M 
     <p1:balance></p1:balance>^M 
     <p1:transAmount></p1:transAmount>^M 
     <p1:borrowingFlag></p1:borrowingFlag>^M 
     <p1:bizSeq></p1:bizSeq>^M 
     <p1:period></p1:period>^M 
     <p1:accrual></p1:accrual>^M 
     <p1:accrualTax></p1:accrualTax>^M 
     <p1:interestRate></p1:interestRate>^M 
     <p1:subCode></p1:subCode>^M 
     <p1:urgent></p1:urgent>^M 
     <p1:ext1></p1:ext1>^M 
    </p0:sendSMS>^M 
    </soapenv:Body>^M 
</soapenv:Envelope>^M 
This is a test 

誰能告訴我,爲什麼出現這種情況,我該如何避免像這種情況呢?謝謝。

+1

這是它是如何*顯示*在一個*特定的環境* - sed的結果不會*改變。也就是說,哪個*編輯器查看結果文件?因爲它很可能會根據啓發式來改變模式。 – user2864740

+0

我認爲編輯器顯示是一個非常可能的答案,但要確認,您可以解構每個進程,並將'| cat -vet「,以確認是否在該點添加了^ M個字符。 (cat -vet將顯示^ I爲標籤,^ M爲\ r,'$'在每行末尾。'$'不在文件中。祝你好運。 – shellter

+3

是你的問題「我該如何擺脫'sed'「輸出中的^ M個字符,或者」我如何向'echo'輸出添加^ M字符「?我懷疑這是因爲你的原始XML文件具有DOS風格的行結尾,但是'echo'只是創建一個* nix風格的行結尾... – twalberg

回答

0

「^ M」是如何顯示CR(回車)字符。這個字符的ASCII碼是13或0xOD。在C中,它用'\ r'表示。它是非Unix系統中的行尾字符之一(我認爲Windows將行尾編碼爲「\ r \ n」,MacOSX直到版本9都有「\ r」,而Unix和OS X只有「\ n」)。

爲了擺脫這些「^ M」字,只需用tr第一刪除它們在你的輸入文件:

sed -n "1,52p" $FILE_NAME 

應該成爲

cat $FILE_NAME | tr -d '\r' | sed -n "1,52p" 
相關問題