替换文件中从 string1 到 string2 的所有内容,包括换行符

问题描述 投票:0回答:2

我有一个包含如下内容的文件:
(标记为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
都应该没问题。

我怎样才能实现这个目标?

bash shell substitution
2个回答
0
投票

使用

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
)。


0
投票
perl -p0e 's/\/\*.*?\*\/\n//sg' file.txt
© www.soinside.com 2019 - 2024. All rights reserved.