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

How to replace a comment line which start with specific characters

我有一个带有全局注释的 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”和“awk”,但都失败了。那么,有人可以帮助我吗?顺便说一句,我更喜欢使用“sed”而不是“awk”。

如果该行以 !那么你可以做类似

的事情
sed 's/^! /! jw/' mycode.fortran >newcodefile.fortran

我会把它放到一个新文件中然后重命名。如果你覆盖你的文件,如果出现任何问题,你最终可能会导致问题。

sed 字符串中的 s 告诉它搜索和替换。 ^ 表示行首,因此如果注释在行中比开头更远,则不会找到该注释。
然后我们搜索以 ! 开头的行然后是 space 并替换为 ! jw 如果你只是运行它作为:

sed 's/^! /! jw/' mycode.fortran

在不将输出重定向到文件的情况下,它会将输出流式传输到您的控制台,以便您查看它是否正常工作。然后 运行 它再次输出到带有重定向 > 的文件,检查文件然后重命名。在您完全确定它可以正常工作并且没有做任何您不想做的事情之前,不要删除您的原始代码文件。

使用负后视模式的 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: how to execute the Perl interpreter: command line switches
perldoc perlre: Perl regular expressions (regexes)
perldoc perlre: Perl regular expressions (regexes): Quantifiers; Character Classes and other Special Escapes; Assertions; Capture groups
perldoc perlre: Negative lookbehind
perldoc perlrequick: Perl regular expressions quick start

  •  sed '/!!/!s/!.*/! jw/' file
    
    • /!!/! 如果该行不包含!!,则
    • s/!.*/! jw/ 将感叹号后面的所有内容替换为 ! jw
  • awk 'BEGIN{FS=OFS="!"}{=" jw"}1' file
    
    • BEGIN{FS=OFS="!"} 将字段分隔符设置为 !
    • {=" jw"} 如果第二个字段不为空,则将其替换为 jw
    • 1 打印行。