我有一个包含如下内容的文件:
(标记为js只是为了更好的可读性,可以是任何纯文本文件)
some text
/*%SKIP% line comment %SKIP%*/
some text
/*%SKIP%
block
comment
I could contain everything except the end sequence
%SKIP%*/
some text
现在我想删除
/*%SKIP%
和 %SKIP%*/
之间的所有内容,以便文件包含:
some text
some text
some text
结果文件中是否存在空行并不重要,但最好在删除内容的位置不保留空行。我能够使用
sed
实现单行,但在多行内容时失败。
我想这应该没那么重要,但作为旁注: “start”和“end”字符串是可变的并存储在 bash 变量
open_tag=/*%SKIP%
和close_tag=%SKIP%*/
中。
唯一的限制是使用大多数 Linux 发行版上通常预安装的工具,因此
sed
、awk
、perl
和 grep
都应该没问题。
我怎样才能实现这个目标?
使用
perl
单行:
$ cat input.txt
some text
/*%SKIP% line comment %SKIP%*/
some text
/*%SKIP%
block
comment
I could contain everything except the end sequence
%SKIP%*/
some text
$ perl -0777 -pe 's{\v*/\*%SKIP%.*?%SKIP%\*/}{}sg' input.txt
some text
some text
some text
这会立即读取整个文件(
-0777
,较新的 perls 可以使用 -g
代替),并替换每个 SKIP 块(前面可以选择“垂直空白”,即回车符和换行符;用于帮助防止空行输出)带有空字符串。使用 .*?
进行非贪婪匹配,因此它不会匹配第一个 /*%SKIP%
和最后一个 %SKIP%*/
之间的所有内容,并且 s
选项允许 .
匹配换行符(g
表示每次匹配)就像sed
)。
perl -p0e 's/\/\*.*?\*\/\n//sg' file.txt