我有一个带有全局注释的fortran代码,它以双感叹号开始(即!!)和个人注释,它以单个感叹号开始(即!),我只是想隐藏我的个人注释行(或将该行替换为另一行,例如!jw")。例如,原始代码看起来像这样:
!! This is a global comment
Code..
Code..
! This is a personal comment
code... ! This is a personal comment
!! This is a global comment
code...
然后,我要将原始代码更新为:
!! This is a global comment
Code..
Code..
! jw
code... ! jw
!! This is a global comment
code...
我尝试使用"sed"one_answers"尴尬",但我失败了。有人能帮帮我吗?我更喜欢用"sed"而不是"awk"顺便说一下。
使用具有反向查找模式的Perl一行程序:
perl -pe 's/(?<!!)!s.*/! jw/' in_file > out_file
就地修改文件:
perl -i.bak -pe 's/(?<!!)!s.*/! jw/' in_file
就地修改多个文件,例如ex*.f90
文件:
perl -i.bak -pe 's/(?<!!)!s.*/! jw/' ex*.f90
Perl单行程序使用这些命令行标志:-e
:告诉Perl查找内联代码,而不是在文件中查找。-p
:每次循环输入一行,默认赋值给$_
。在每次循环迭代后添加print $_
。-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,保存原始文件的备份副本,将扩展名.bak
附加到其名称后。
(?<!!)!
:前面没有感叹号的感叹号。s
:空白。.*
:任何字符,重复0次或以上。
参见:perldoc perlrun
:如何执行Perl解释器:命令行开关perldoc perlre
: Perl正则表达式(regexes)perldoc perlre
: Perl正则表达式(regexes):量词;字符类和其他特殊转义;断言;捕获组perldoc perlre
:反向查找perldoc perlrequick
: Perl正则表达式快速启动
sed '/!!/!s/!.*/! jw/' file
/!!/!
如果行中不包含!!
,则s/!.*/! jw/
用! jw
代替感叹号后面的所有内容。
awk 'BEGIN{FS=OFS="!"}$2{$2=" jw"}1' file
BEGIN{FS=OFS="!"}
设置字段分隔符为!
$2{$2=" jw"}
如果第二个字段不为空,则用jw
代替。1
打印行
如果该行以!然后你可以输入
sed 's/^! /! jw/' mycode.fortran >newcodefile.fortran
我会把它放到一个新文件中,然后重新命名。如果你覆盖你的文件,你可能会导致问题,如果任何错误。
要sed的字符串中的s告诉它搜索和替换。^表示行开始,所以如果注释比行开始更靠后,就找不到注释了。
然后搜索以!开头的行。后面跟一个空格,然后用!jw如果你只是运行它:
sed 's/^! /! jw/' mycode.fortran
不将输出重定向到一个文件,它将输出流到您的控制台,这样您就可以看到它是否在工作。然后再次运行它,用重定向>输出到一个文件,检查文件,然后重命名。在你完全确定它可以工作并且没有做任何你不想做的事情之前,不要删除你的原始代码文件。