我有一个 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