Regex sed将线连接在一起

Regex sed将线连接在一起,regex,linux,sed,Regex,Linux,Sed,要将文件中不以字符“0”结尾的行连接在一起,sed(或其他工具)命令是什么 我要这样的台词 这需要单独处理,然后我会有这样的线,例如(这是3行,但只有一端是w/0) 需要连接/组合成一条线的 如果以0存储结束,请删除换行符 sed '/0$/!N;s/\n//' 典型的隐晦Perl单行程序: perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/' 这使用序列“0\n”作为记录分隔符(根据您的问题,我假设每一行都应该以零结尾)。然后,任何记录都不应具有内部换行符,因此

要将文件中不以字符“0”结尾的行连接在一起,sed(或其他工具)命令是什么

我要这样的台词

这需要单独处理,然后我会有这样的线,例如(这是3行,但只有一端是w/0)

需要连接/组合成一条线的


如果以0存储结束,请删除换行符

sed '/0$/!N;s/\n//'

典型的隐晦Perl单行程序:

perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/'
这使用序列“0\n”作为记录分隔符(根据您的问题,我假设每一行都应该以零结尾)。然后,任何记录都不应具有内部换行符,因此这些换行符将被删除,然后打印该行,并附加已删除的0和换行符

另一个问题是确保每条管线有17个管道分隔字段。这并不假定第17个字段值必须为零

awk -F \| '
    NF == 17 {print; next}
    prev {print prev $0; prev = ""}
    {prev = $0}
'
在循环中(将
ba
分支到标签
:a
),如果当前行以0(
/0$/
)结尾,则追加下一行(
N
)并删除内部换行符(
s/\N/

awk:

awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'
perl -pe '$_.=<>,s/\n// while /0$/'
while read line; do 
    if [ ${line: -1:1} != "0" ] ; then 
        echo $line
    else echo -n $line
fi
done 
Perl:

awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'
perl -pe '$_.=<>,s/\n// while /0$/'
while read line; do 
    if [ ${line: -1:1} != "0" ] ; then 
        echo $line
    else echo -n $line
fi
done 

awk也可能很短:

awk '!/0$/{printf $0}/0$/'
测试:

这一评级令人惊讶
;s
(sed替换上这个令人惊讶的眨眼表情双关语是故意的)给定OP规范:

这是最后的评论


“如果是这样,请检查@ninjalj提交的内容”

还建议检查一下

即:使用
sed:a进行检查/0$/{N;s/\N//;ba}'
逐字记录

sed ':a;/0$/{N;s/\n//;ba}'
 does
 no one
 ie. 0
 people,
 try
 nothing,

 ie. 0
 things,
 any more,
 ie. 0
 tests?

          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)
不会给出(做测试;):

要获得此用途,请执行以下操作:

sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
或:

不是:


注:

sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
不使用分支和
与以下内容相同:

sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'
  • H
    开始所有序列
  • d
    短路当前行上的进一步脚本命令执行,并开始下一个循环,以便在
    /0$/之后执行地址选择器只能是
    /0$/因此
    /0$/{H;z;x;s/\n//g;}
    是冗余的,不需要
  • 如果行未以0结尾,则将其保存在保留空间中
    /0$/!{H;d;}
  • 如果一行以0结尾,则也保存该行,然后进行同调打印(双字节即清除并对齐行)
    /0$/{H;z;x;s/\n//g;}
  • NB
    ${H;z;x;s/\n//g;p;}
    使用带有额外
    p
    /0$/…
    命令强制最终打印,并使用现在不必要的
    z
    (清空和重置模式空间,如s/*/)

我认为这不太管用。如果我理解这个问题,没有零应该是一条很长的线。但是当我尝试使用“$ls | sed”/0$/”时!Ns/\n/'我发现它只成对地连接线。埃里克,你是对的。如果没有0,那么我需要删除换行符如果是这种情况,请检查@ninjalj提交的内容。问题是,如果行不以“0”结尾,请加入。考虑到sed的作用正好相反,下面是一个解决bash循环中OP所要求的问题的方法,尽管它看起来更丑陋,但实际上它更快、更灵活、更容易理解和调试。我能够将它调整为连接行,条件是:连接以“https”开头的每一行:使用以下所有行,直到下一行以“https”开头:。在macOS上,分支对我不起作用,但删除了它:
sed'/my pattern/{N;s/\N/;}'
Hi!你能简单描述一下它是如何工作的吗?:)这是非常简单的哪一部分你有问题去理解?嗯:(1)那是什么命令,有四个斜杠?(2) 最后的“0$”部分是如何工作的?(3) 一般来说,如何搜索此命令的文档在使用此命令将近一个小时后,您能否确认以下解释:对于结尾没有0的每一行,打印该行(不带换行符)。然后,另一个正则表达式开始:对于每一个末尾有0的行,不要触摸它(这会导致“正常打印它,包括它的换行符”)
sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
sed ':a;/0$/!{N;s/\n//;ba}'
sed ':a;/0$/{N;s/\n//;ba}'
sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'