将以换行符结尾的模式替换为不带换行符的相同模式

将以换行符结尾的模式替换为不带换行符的相同模式

我有一个 javascript 文件,在特定单词“[FACT]”之后有两行新行,我想用一个换行符替换它。我需要在 bash 脚本中执行此操作。通常情况下,我会使用,sed但事实证明这sed不适合处理输入中的换行符。 (如果我错了请纠正我)。

要以编程方式完成此操作,我可以使用 shell 脚本或 javascript/Java 等来实现此目的,但从软件工程(可维护性、可移植性等)的角度来看,这将是一个好的解决方案。

sed 's/\[FACT\]\/n/\[FACT\]/g' file.js

答案1

可移植性?文本处理?当然是 Perl:

perl -n0777e 's{\n+}{\n}g' your_file

where-0777指示 Perl 立即读入整个文件,以便 Perl 可以找到连续的新行。

上面将删除所有重复的换行符。要仅删除 后面的内容[FACT],您可以执行以下操作:

perl -n0777e 's{\[FACT\]\n+}{\n}g' your_file

答案2

我假设“两个新行”的意思是\n\n,而不是该行后面的两个空白行[FACT](这将是三个换行符)。不管怎样,sed 都会工作,因为它只删除 后的第一个换行符[FACT]

$ echo -e '[FACT]\n\nend'
[FACT]

end

这将搜索以 结尾的行[FACT]以及匹配的每一行,我们使用N该行将下一行追加到当前模式空间中,并保留 sed 通常从模式空间中剥离的换行符。

$ echo -e '[FACT]\n\nend' |sed '/\[FACT\]$/ { N; s/\n// }'
[FACT]
end

如果[FACT]不需要特别位于行尾,请$从命令中删除 。

请注意,从技术上讲,这会从包含的行末尾去除换行符,[FACT]因此从技术上讲,它将两行连接成一行:

$ echo -e '[FACT]\nhelp\nend' 
[FACT]
help
end

$ echo -e '[FACT]\nhelp\nend' |sed '/\[FACT\]$/ { N; s/\n// }'
[FACT]help
end

相关内容