我有一个简单的问题。我需要在两种模式之间删除\ n的所有匹配项。即。删除所有出现在两个模式之间的新行(sed或awk?)
<INFOSTART
A=1
B=2
C=3
D=4
<INFOEND
<INFOSTART
G=1
Z=3
<INFOEND
所以我想输出是类似于以下
A=1 B=2 C=3 D=4
G=1 Z=3
任何想法,我该怎么办呢?并提前家伙感谢..
我有一个简单的问题。我需要在两种模式之间删除\ n的所有匹配项。即。删除所有出现在两个模式之间的新行(sed或awk?)
<INFOSTART
A=1
B=2
C=3
D=4
<INFOEND
<INFOSTART
G=1
Z=3
<INFOEND
所以我想输出是类似于以下
A=1 B=2 C=3 D=4
G=1 Z=3
任何想法,我该怎么办呢?并提前家伙感谢..
您可以使用一个简单的状态机awk
,如与下面的输入文件,稍加修改中,也允许文本外标记(如果没有这样的文本,它会仍然工作的需要,这只是处理额外箱子):
xyzzy
plugh
<INFOSTART
A=1
B=2
C=3
D=4
<INFOEND
twisty
passages
<INFOSTART
G=1
Z=3
<INFOEND
after
last
有了这样的(或原始的数据文件),以下awk
命令给你你需要什么,开始之间的结合线和结束标记合并为一行:
awk ' /^<INFOSTART$/ {inside=1; sep=""; next}
/^<INFOEND$/ {inside=0; print ""; next}
inside {printf sep""$0; sep=" "; next}
{print}' input_file
xyzzy
plugh
A=1 B=2 C=3 D=4
twisty
passages
G=1 Z=3
after
last
更详细地检查awk
代码,以下各节将在每行中进行扩展。
只要找到仅包含开始标记的行,就会运行以下段。它将inside
状态设置为true(非零)以指示您应该开始合并行,并将初始分隔符设置为空字符串以确保组合行上没有前导空格。该next
只是去,并立即抓住下一个输入线,开始一个新的循环:
/^<INFOSTART$/ {inside=1; sep=""; next}
假设你没有找到一个开始标记,该片段进行结束标志运行。如果找到,则inside
状态将重置为false(零),以开始输出与输入文件中显示的行完全相同的行。它还输出一个换行符妥善完成合并行,然后重新启动下一个输入线周期:
/^<INFOEND$/ {inside=0; print ""; next}
如果您已经确定行既不是开始也不是结束标志,你的行为取决于inside
状态。为了实现这一点,您需要将输入行组合到一个输出行中,因此只需简单地打印即可,而不会在尾随换行符处打印分隔符,然后是行本身。然后,将分隔符设置为一个空格,以便下一个输入行将与前一行正确分隔。然后,它循环回到下一个输入行:
inside {printf sep""$0; sep=" "; next}
最后,如果你来到这里,你知道你是一个开始/结束部分之外,所以你只是呼应,正是因为它存在于行输入文件:
{print}'
如果您不想格式良好的版本,你可以使用下面的缩小的版本,假设你是某只<INFO...
线的开始和结束标记:
awk '/^<INFOS/{a=1;b="";next}/^<INFOE/{a=0;print"";next}a{printf b$0;b=" ";next}1'
但是,由于这可能是一个脚本而不是单行命令,我倾向于坚持使用可读的版本。
Perl来救援:
< input perl -ne 's/\n/ /, print if $s = /<INFOSTART/ .. ($e = /<INFOEND/)
and $s > 1 and !$e;
print "\n" if $e'
$ S当我们的标签(使用..
运营商)之间的是真实的。如果我们匹配结束标记,则$ e为真,当匹配开始标记时,$ s为1。
当然,这不是Perl中,我实际上可以读它:-) – paxdiablo
随着tr
和sed
:
AMD$ tr '\n' ' ' < File | sed 's/<INFOSTART //g; s/<INFOEND /\n/g'
A=1 B=2 C=3 D=4
G=1 Z=3
替换所有newlines
与space
第一。然后使用sed
删除所有<INFOSTART
并用newlines
替换全部<INFOEND
。
didnt想想那.. ..谢谢 –
这可能为你工作(GNU SED):
sed '/^<INFOSTART/d;:a;N;/^<INFOEND/M!s/\n/ /;ta;P;d' file
这将删除开始<INFOSTART
或<INFOEND
线,用空格替换所有其他行之间的换行符。
该解决方案可以削减进一步下降(提供文件很好地形成)到:
sed '/^</d;:a;N;/^</M!s/\n/ /;ta;P;d' file
工作一个魅力感谢状.. –