2014-06-07 267 views
0

我有一個文件,其中第一對夫婦行的開始#馬克內特定的文本,然後按照傳統的網表,在這裏也可以有行與#馬克開始。我需要在#開始的第一行的塊和經典網表的第一行之間插入一行文字protect。在文件的結尾,我需要插入文字unprotect。由於受保護的原始文件,將此修改後的文本保存爲具有特定名稱的新文件將是一件好事。AWK-插入行與特定位置

示例文件:

// Generated for: spectre 
// Design library name: Kovi 
// Design cell name: T_Line 
// Design view name: schematic 
simulator lang=spectre 
global 0 
parameters frequency=3.8G Zo=250 
// Library name: Kovi 
// Cell name: T_Line 
// View name: schematic 
T8 (7 0 6 0) tline z0=Zo f=3.8G nl=0.5 vel=1 
T7 (net034 0 net062 0) tline z0=Zo f=3.8G nl=0.5 vel=1 
T5 (net021 0 4 0) tline z0=Zo f=3.8G nl=0.5 vel=1 
T4 (net019 0 2 0) tline z0=Zo f=3.8G nl=0.5 vel=1 
+2

你特別需要這'awk'代碼或將任何基於殼的解決方案是否足夠呢?你能提供一個示例文件嗎? – Sorpigal

+0

你能發表您的電子郵件嗎?我發給你樣本文件。謝謝 – kovibb

+1

@kovibb不,在你的問題上發佈示例文件。 –

回答

0

如何sed

sed -e '/^#/,/^#/!iprotect'$'\n''$aunprotect'$'\n' input_file > new_file 

在註釋行的第一個塊後的線路本身插入「保護」,然後將「解除」末。

注:因爲我使用$'\n'代替文字換行符bash被假定爲shell。

0

既然你「一旦Ð後

awk 'BEGIN{ protected=""} { if($0 !~ /#/ && !protected){ protected="1"; print "protect";} print $0}END{print "unprotect";}' input_file > output_file 

#作爲第一個非空格字符檢測一行時,它會輸出與protect線。最後它會輸出一行unprotect

測試文件

# 
# 
# 
    #Preceded by a tab 
begin protect 

# 

before unprotect 

結果

# 
# 
# 
    #Preceded by tab 
protect 
begin protect 

# 

before unprotect 
unprotect 

編輯: 刪除了[:space:]*,因爲它似乎已默認處理。


支持//

如果你想支持#//在同一個腳本,正則表達式部分將變爲/#|\//特殊字符/必須使用\進行轉義。

這將檢查至少一個/

添加量詞{2}將完全匹配///#|\/{2}/

+0

優秀,這個工程。很感謝。怎麼我必須更改代碼,如果「#」是ECHANGE以「//」,好嗎?我問,因爲「/」是特殊字符。 – kovibb

+0

檢查第一個'/'應該就足夠了。將該信息添加到帖子中。 – Origineil

+0

感謝這非常有用。但是現在我看,還有沒有//的文件。在這種情況下,腳本只能插入'unprotect'關鍵字。所以存在一些首先檢查以//開頭的文件的方式? – kovibb