如何替换以特定字符开头的注释行
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
打印行。
我有一个带有全局注释的 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
打印行。