Sed删除2+行的匹配

时间:2017-01-27 14:52:45

标签: android shell scripting posix gnu

所以我试图删除匹配的某些接收器中的“deep_buffer”源,例如“Earpiece”和“Wired Headset”。当我们之间有换行符时,我该怎么做?我正在寻找两种方式。首先,匹配排除和修补其余部分和/或只修补我想要的那些,例如上面提到的那些(来自匹配)。我在android中使用posix shell。

原始代码:

<routes>
    <route type="mix" sink="Earpiece"
           sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
    <route type="mix" sink="Speaker"
           sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
    <route type="mix" sink="Wired Headset"
           sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
    <route type="mix" sink="Wired Headphones"
           sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
    <route type="mix" sink="Line"
           sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
    <route type="mix" sink="HDMI"
           sources="primary output,raw,deep_buffer,multichannel,direct_pcm,compressed_offload"/>
    <route type="mix" sink="Proxy"
           sources="primary output,raw,deep_buffer,multichannel,direct_pcm,compressed_offload"/>
    <route type="mix" sink="FM"
           sources="primary output"/>
    <route type="mix" sink="BT SCO All"
           sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
    <route type="mix" sink="Telephony Tx"
           sources="voice_tx"/>
    <route type="mix" sink="primary input"
           sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,Telephony Rx"/>
    <route type="mix" sink="surround_sound"
           sources="Built-In Mic,Built-In Back Mic"/>
    <route type="mix" sink="record_24"
           sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic"/>
    <route type="mix" sink="voice_rx"
           sources="Telephony Rx"/>
</routes>

预期的输出会从匹配的接收器中删除deep_buffer,例如下面的“有线耳机”和“有线耳机”(但只有匹配的接收器):

   <routes>
        <route type="mix" sink="Earpiece"
               sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
        <route type="mix" sink="Speaker"
               sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
        <route type="mix" sink="Wired Headset"
               sources="primary output,raw,direct_pcm,compressed_offload,voip_rx"/>
        <route type="mix" sink="Wired Headphones"
               sources="primary output,raw,direct_pcm,compressed_offload,voip_rx"/>
        <route type="mix" sink="Line"
               sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
        <route type="mix" sink="HDMI"
               sources="primary output,raw,deep_buffer,multichannel,direct_pcm,compressed_offload"/>
        <route type="mix" sink="Proxy"
               sources="primary output,raw,deep_buffer,multichannel,direct_pcm,compressed_offload"/>
        <route type="mix" sink="FM"
               sources="primary output"/>
        <route type="mix" sink="BT SCO All"
               sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
        <route type="mix" sink="Telephony Tx"
               sources="voice_tx"/>
        <route type="mix" sink="primary input"
               sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,Telephony Rx"/>
        <route type="mix" sink="surround_sound"
               sources="Built-In Mic,Built-In Back Mic"/>
        <route type="mix" sink="record_24"
               sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic"/>
        <route type="mix" sink="voice_rx"
               sources="Telephony Rx"/>
    </routes>

1 个答案:

答案 0 :(得分:1)

我不确定这是否是您想要的,但这是一个快速而又脏的Perl程序,它删除字符串&#34;深度缓冲区,&#34;仅从包含字符串的那些后面的行&#34; Earpiece&#34;和#34;有线耳机&#34;。我试着写它以便逻辑很容易理解。

#!/usr/bin/perl

$flag = "0";
while ( <> ) {
    if ( $flag eq "1" )
    {
        s/deep_buffer,//g;
        $flag = "0";
    }
    elsif ( /"Earpiece"/ || /"Wired Headset"/ )
    {
        $flag = "1";
    }
    print;
}
exit;