2014-06-07 228 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