2012-03-18 192 views
2

我有一個包含若干行的文件:命令截斷文件中引用的字符串?

revision="abcdabcdabcd0000111122223333" 
revision="0000111122223333444455556666" 

我要截斷帶引號的字符串(例如,8)所示:

revision="abcdabcd" 
revision="00001111" 

如何使用sed/awk/perl要達到這個目標嗎?

回答

3

也許:

sed -i 's/\(revision="........\)[^"]*"/\1"/' file 
3

是關鍵字總是修訂?字符串中的信息是否總是長於8個字符?

我想我會看是這樣的:

sed 's/^\([a-z]*\)="\([^"]\{1,8\}\)[^"]*"/\1="\2"/' input > output 

這看起來對於任何小寫唯一關鍵字(這是記憶)等號和一個雙引號之前,然後查找1-8非雙引號字符(被記住),其後是零個或多個其他非雙引號和雙引號;這些被替換爲關鍵字,等於,雙引號,記住的非雙引號和雙引號。如果有任何尾隨材料,則不做修改。

+0

(+1)...錯字:它在開始時需要's'。 'sed's/...' – 2012-03-18 08:31:07

+0

感謝 - @ Peter.O和Glenn。 – 2012-03-18 14:35:08

0

一個Perl的解決方案:

perl -pi.bak -we 's/^revision="[^\n"]{0,8}\K.*/"/' myfile.txt 

將節省備份myfile.txt.bak。刪除i.bak以僅查看輸出而不更改文件。刪除.bak不存儲備份(不可逆轉)。

該正則表達式將查找並更改以revision="開頭的任何行。在這場比賽之後,它將保留以下0-8個不是雙引號或換行符(*)的字符,並刪除其餘的。它將在換行符之前添加一個雙引號。

(*)添加了換行符以防止嵌入的換行符或格式不正確的行損壞文件。這將通過添加關閉引號來「解決」打開雙引號。

0
perl -i~ -pe's/^revision="[^"]{0,8}\K[^"]+//' file