如何替换以特定字符开头的注释行



我有一个带有全局注释的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

不将输出重定向到一个文件,它将输出流到您的控制台,这样您就可以看到它是否在工作。然后再次运行它,用重定向>输出到一个文件,检查文件,然后重命名。在你完全确定它可以工作并且没有做任何你不想做的事情之前,不要删除你的原始代码文件。

最新更新