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