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

Perl 如何替换以特定字符开头的注释行,perl,sed,Perl,Sed,我有一个带有全局注释的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...

我有一个带有全局注释的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告诉它搜索并替换。 ^表示行的开头,因此如果注释在行中比开头更远,则找不到该注释。
然后我们搜索以开头的行!后面跟着一个空格并替换为!jw 如果您只是以以下方式运行它:

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

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

使用Perl one liner和负查找模式:

perl -pe 's/(?<!!)!\s.*/! jw/' in_file > out_file
Perl one liner使用以下命令行标志:
-e
:告诉Perl在线查找代码,而不是在文件中。
-p
:一次循环输入一行,默认情况下将其分配给
$\uu
。在每次循环迭代后添加
print$\uuz

-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在原始文件的名称后附加扩展名
.bak
,保存原始文件的备份副本

(?:前面没有感叹号的感叹号。
\s
:空白。
*
:任何字符,重复0次或更多次

另请参见:




    • /!!/!
      如果该行不包含
      !!
      ,则
    • s/!*/!jw/
      将感叹号后面的所有内容替换为
      !jw
    • BEGIN{FS=OFS=“!”}
      将字段分隔符设置为
    • $2{$2=“jw”}
      如果第二个字段不是空的,用
      jw
      替换它
    • 1
      打印该行

感谢您的评论,但这种方法不起作用。只有在句子(代码)正确时,才会将“!”改为“!jw”以“!”开头。例如,它将“!这是一条个人评论”改为“!JWT这是一条个人评论”。谢谢你,帖木儿。当我执行代码时,我有以下错误:在/main.prl第3行,靠近“pe”的地方找到了运算符所需的字符串/(?@Jungwoo这是一个Perl单行程序,这意味着代码应该在shell中执行,也就是在UNIX/Linux/macOS中的命令行上执行。你应该以与另一个答案中执行
sed's/^!/!jw/'in_file>out_file
相同的方式执行它。哇,很有效!非常感谢。我还有一个问题。我有50多个问题运行源代码,我想对所有源代码执行此步骤。那么,我是否有可能立即执行此操作?例如,如果我有'ex1.f90'~'ex50.f90',我想全部更改它们。在Fortran中,注释行以“!”开头。无论“!”在哪里开始,在“!”之后都被视为注释行。这就是为什么我可以同时使用“!!”或“!”!“甚至”!“作为评论行。
perl -i.bak -pe 's/(?<!!)!\s.*/! jw/' in_file
perl -i.bak -pe 's/(?<!!)!\s.*/! jw/' ex*.f90
 sed '/!!/!s/!.*/! jw/' file
awk 'BEGIN{FS=OFS="!"}$2{$2=" jw"}1' file