如何在使用sed创建模式之前删除换行符/换行符

如何在使用sed创建模式之前删除换行符/换行符,sed,awk,Sed,Awk,标题已经说明: 我想使用一些linux单行程序(例如sed) 转化 Anytext { 进入 这可以使用sed完成吗?如果不使用sed,则使用awk单衬套完成吗?当然 sed 'N;s/\n{/{/' 或者更全面的版本: sed ':r;$!{N;br};s/\n{/{/g' 这里,:r设置了一个标签,我们可以参考该标签来创建循环 $!{…}对除最后一行以外的每一行执行给定的命令集 N;br是在循环中执行的两个命令:N向模式空间追加新行,br分支回到标签r,完成循环 然后,在运行最后一个命

标题已经说明:

我想使用一些linux单行程序(例如sed)

转化

Anytext
{
进入

这可以使用sed完成吗?如果不使用sed,则使用awk单衬套完成吗?

当然

sed 'N;s/\n{/{/'
或者更全面的版本:

sed ':r;$!{N;br};s/\n{/{/g'
这里,
:r
设置了一个标签,我们可以参考该标签来创建循环

$!{…}
对除最后一行以外的每一行执行给定的命令集

N;br
是在循环中执行的两个命令:
N
向模式空间追加新行,
br
分支回到标签
r
,完成循环

然后,在运行最后一个命令时,所有文件都位于模式空间中:

s/\n{/{/g
如果您在类似的情况下尝试,您可以看到这两种方法之间的差异

Anytext
{
{
{

单向使用
sed

sed -ne '$! N; /^.*\n{/ { s/\n//; p; b }; $ { p; q }; P; D' infile
测试。假设
infle
包含内容:

one
Anytext
{
two
three
{
four
five
{
输出将是:

one
Anytext{
two
three{
four
five{

如果打算从
\n{
序列中删除换行符
bbe
似乎是最简单的工具:

bbe -e 's/\n{/{/' infile
这可能适用于您(GNU-sed):

使用
awk

cat file
one
Anytext
{
two
three
{
four
five
{

第一个就足够了,我正在修改C++函数定义,所以这是fine@Martin
N
在模式空间中追加一行,这样模式空间中就有两行用
\N
隔开。有关命令列表或更广泛的参考,请参阅
手动执行
。非常好的第二次匹配。一个解释会很好。如果您有多个连续的行要删除换行符,那么第二个选项非常有用。@AnnevanRossum谢谢。我添加了一个简短的解释,希望有帮助。回答非常好。以前从未听说过bbe,它似乎不是标准发行版的一部分(至少在Ubuntu下)并且需要单独下载。虽然看起来很有用。它已经成为Debian的一部分一段时间了,并且生活在。我已经发现了它的一些用途,例如在二进制流中查找标记并在它们之间保存数据。
sed ':a;$!{N;/.*\n{/ba};s/\n{/{/g;P;D' file
cat file
one
Anytext
{
two
three
{
four
five
{
awk '{printf (!/^{/&&NR>1?RS:x)"%s",$0} END {print ""}' file
one
Anytext{
two
three{
four
five{