我想创建一个脚本,在Fortran 90中大写我的源代码的关键字,我考虑使用正则表达式和sed
(这可能是我的第一个错误:P)。但是,我没有设法让匹配丢弃评论中的字词(在我的代码中,!
之后的所有内容)和字符串(单个'...'
之间的所有内容或双引号"..."
)
这个想法是有一个包含Fortran所有关键字的列表(if,end if,subroutine,abs,allocate ...)并使用sed和这个正则表达式。请告诉我如何做到这一点,以及这种方法是否正确或有更好的方法来实现我想要的。它必须是可能的,因为编辑正确地突出了这个词。伙计,如果我能告诉Emacs“请把蓝字说出来!” :)
答案 0 :(得分:0)
肯定有更好的方法,但目前我无法告诉你
所以使用正则表达式,你应该采取以下步骤:
重置你可以用你存储它们的数组的索引替换它们
如果您的字符串没有超过几行,您可以按行每行进行
答案 1 :(得分:0)
不了解sed,但使用Perl你可以使用类似的东西:
perl -p -E 's/(\'[^\']*\'|"[^"]*"|!.*)|\b(if|end|subroutine|abs|allocate)\b/$1\U$2/gi' file
(根据需要调整引用/评论表达。)
答案 2 :(得分:0)
最后一位朋友为我找到了一个解决方案,不是使用正则表达式而是使用python。我在这里分享,以防其他人面临这个问题。这是python代码;它需要两个参数:输入和输出文件。
#!/usr/bin/python
import sys
import re
if (len(sys.argv)<3):
print "Try with two arguments."
sys.exit()
FILEIN = sys.argv[1]
FILEOUT = sys.argv[2]
substitutions = { \
"call":"CALL" ,\
"parameter":"PARAMETER" ,\
"allocatable":"ALLOCATABLE" ,\
"dimension":"DIMENSION" ,\
"integer":"INTEGER" ,\
"logical":"LOGICAL" ,\
"double precision":"DOUBLE PRECISION" \
}
patterns = []
for s in substitutions:
patterns.append(["(^[^!]*)\\b%s\\b"%s,"\\1%s"%substitutions[s]])
patterns.append(['("[^"]*)\\b%s\\b([^"]*")'%substitutions[s],"\\1%s\\2"%s])
patterns.append(["('[^']*)\\b%s\\b([^']*')"%substitutions[s],"\\1%s\\2"%s])
patterns.append(["(\([^\)]*)\\b%s\\b([^\)]*\))"%substitutions[s],"\\1%s\\2"%s])
retList = []
f = open(FILEIN,"r")
for line in f:
for p in patterns:
prevLine=""
nextLine="1"
while (prevLine!=nextLine):
nextLine = re.sub(p[0],p[1],line)
prevLine = line
line = nextLine
retList.append(line)
f.close()
f = open(FILEOUT,"w")
f.write(''.join(retList))
f.close()
答案 3 :(得分:0)