【问题标题】:How to replace a comment line which start with specific characters如何替换以特定字符开头的注释行
【发布时间】:2021-05-01 11:55:22
【问题描述】:

我有一个带有全局 cmets 的 fortran 代码,它以双感叹号(即 !!)和个人 cmets 开头,以单个感叹号(即!)开头,我只想隐藏我的个人注释行(或用另一行替换该行,例如,'!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”。

【问题讨论】:

  • 在 Fortran 中,注释行以“!”开头。不管在哪里“!”开始,在“!”之后被视为注释行。这就是为什么我可以同时使用“!!”要么 ”!”甚至“!”作为注释行。

标签: perl sed


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的评论,但这种方法不起作用。它改变 '! ' 到 '! jw' 仅当句子(代码)以 '! '。例如。它改变 '!这是个人评论'对'! jw这是个人评论”。
【解决方案2】:

使用 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

(?&lt;!!)!:前面没有感叹号的感叹号。
\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

【讨论】:

  • 谢谢你,帖木儿。当我执行代码时出现以下错误: String found where operator expected at ./main.prl line 3, near "pe 's/(?
  • @Jungwoo 这是 Perl one liner,意思是代码应该在 shell 中执行,即在 UNIX/Linux/macOS 的命令行上。您应该以与在另一个答案中执行 sed 's/^! /! jw/' in_file &gt; out_file 相同的方式执行它。
  • 哇,它有效!太感谢了。我还有一个问题。我有50多个fortran源代码,我想对所有源代码都做这一步。那么,有没有可能我可以一次完成这项工作?例如,如果我有 'ex1.f90' ~ 'ex50.f90',我想全部更改。
【解决方案3】:
  •  sed '/!!/!s/!.*/! jw/' file
    
    • /!!/! 如果该行不包含!!,则
    • s/!.*/! jw/ 将感叹号后面的所有内容替换为! jw
  • awk 'BEGIN{FS=OFS="!"}$2{$2=" jw"}1' file
    
    • BEGIN{FS=OFS="!"} 将字段分隔符设置为!
    • $2{$2=" jw"} 如果第二个字段不为空,则替换为 jw
    • 1 打印该行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多