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

时间:2021-01-27 15:54:19

标签: 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...

然后,我想将原始代码更新为:

!! This is a global comment  
Code..
Code..

! jw
code... ! jw

!! This is a global comment
code...

我曾尝试使用“sed”和“awk”,但失败了。那么,有人可以帮助我吗?顺便说一下,我更喜欢使用“sed”而不是“awk”。

3 个答案:

答案 0 :(得分:2)

使用 Perl one-liner 和负后视模式:

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 one-liner 使用这些命令行标志:
-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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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

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

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

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

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

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