簡體   English   中英

如何獲取第一個 sed 的輸出並將其用作第二個 sed 輸入

[英]How to take output of first sed and use it as second sed input

<acdb_ids>
    <device name="SND_DEVICE_OUT_SPEAKER" acdb_id="15"/>
    <device name="SND_DEVICE_OUT_SPEAKER_REVERSE" acdb_id="15"/>
    <!-- add by lifei for A2DP Dirac audio effect 20170413-->
    <device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="10"/>
    <!-- add by lifei end-->
    <device name="SND_DEVICE_OUT_SPEAKER_PROTECTED" acdb_id="124"/>
    <device name="SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE" acdb_id="131"/>
    <device name="SND_DEVICE_IN_VOICE_REC_TMIC" acdb_id="131"/>
    <device name="SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE" acdb_id="132"/>
    <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED" acdb_id="150"/>
    <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT" acdb_id="150"/>
    <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1" acdb_id="151"/>
    <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2" acdb_id="152"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC" acdb_id="133"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_MIC" acdb_id="143"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_STEREO_MIC" acdb_id="144"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
    <!-- #ifdef VENDOR_EDIT -->
    <!-- aditya.gunda@Multimedia, 2019/10/16, EIDQ-5951, fix low volume issue -->
    <device name="SND_DEVICE_IN_HANDSET_MIC_REC_SINGLE" acdb_id="4"/>
    <!-- #endif -->
</acdb_ids>

<bit_width_configs>
        <device name="SND_DEVICE_OUT_SPEAKER_PROTECTED" bit_width="24"/>
</bit_width_configs>

這些行在audio_platform_info .xml 中,所以我想要做的是從 <acdb_ids> 讀取所有設備名稱並將它們附加到 <bit_width_configs>。 下面表示腳本執行后的預期輸出。

<acdb_ids>
    <device name="SND_DEVICE_OUT_SPEAKER" acdb_id="15"/>
    <device name="SND_DEVICE_OUT_SPEAKER_REVERSE" acdb_id="15"/>
    <!-- add by lifei for A2DP Dirac audio effect 20170413-->
    <device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="10"/>
    <!-- add by lifei end-->
    <device name="SND_DEVICE_OUT_SPEAKER_PROTECTED" acdb_id="124"/>
    <device name="SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE" acdb_id="131"/>
    <device name="SND_DEVICE_IN_VOICE_REC_TMIC" acdb_id="131"/>
    <device name="SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE" acdb_id="132"/>
    <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED" acdb_id="150"/>
    <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT" acdb_id="150"/>
    <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1" acdb_id="151"/>
    <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2" acdb_id="152"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC" acdb_id="133"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_MIC" acdb_id="143"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_STEREO_MIC" acdb_id="144"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
    <!-- #ifdef VENDOR_EDIT -->
    <!-- aditya.gunda@Multimedia, 2019/10/16, EIDQ-5951, fix low volume issue -->
    <device name="SND_DEVICE_IN_HANDSET_MIC_REC_SINGLE" acdb_id="4"/>
    <!-- #endif -->
</acdb_ids>

<bit_width_configs>
    <device name="SND_DEVICE_OUT_SPEAKER" bit_width="24"/>
    <device name="SND_DEVICE_OUT_SPEAKER_REVERSE" bit_width="24"/>
    <device name="SND_DEVICE_OUT_BT_A2DP" bit_width="24"/>
    <device name="SND_DEVICE_OUT_SPEAKER_PROTECTED" bit_width="24"/>
    <device name="SND_DEVICE_IN_VOICE_REC_QMIC_FLUENCE" bit_width="24"/>
    <device name="SND_DEVICE_IN_VOICE_REC_TMIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE" bit_width="24"/>
    <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED" bit_width="24"/>
    <device name="SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT" bit_width="24"/>
    <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1" bit_width="24"/>
    <device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2" bit_width="24"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_MIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_MIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_STEREO_MIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" bit_width="24"/>
    <device name="SND_DEVICE_IN_HANDSET_MIC_REC_SINGLE" bit_width="24"/>
</bit_width_configs>

所以我的問題是如何將第一個 sed 命令的這些輸出附加到 <bit_width_configs> 上。

你在那里的方向是正確的。 要運行多個sed模式,請使用; ,像這樣:

sed -n '/<acdb_ids>/,/<\/acdb_ids>/p ; s/acdb_id=".*"/bit_width="24"/p' audio_platform_info.xml

如果要覆蓋就地使用-i選項。

sed -ni '/<acdb_ids>/,/<\/acdb_ids>/p ; s/acdb_id=".*"/bit_width="24"/p' audio_platform_info.xml

如果你想覆蓋並創建一個名為audio_platform_info.xml.bak的備份:

sed -ni.bak '/<acdb_ids>/,/<\/acdb_ids>/p ; s/acdb_id=".*"/bit_width="24"/p' audio_platform_info.xml

這可能對你有用(GNU sed):

sed -En '/<acdb_ids>/{:a;n;/<device/{s/ acdb.*//;H};/<\/acdb_ids/!ba;H;x;x}
         /<bit_width_configs/!b;p;n
         s/.* //;G;:b;s/^([^\n]*)(.*)"\n/\1\2 \1\n/;tb
         s/^.*\n\n(.*)\n.*/\1/p;n;p;q' file

概述:保存設備信息,打印bit_width_configs的開始標記,將 bit_width 詳細信息附加到詳細信息行,打印它們和結束標記並退出。

打開擴展正則-En並關閉隱式打印-En

匹配打開的acdb_ids標簽並將設備信息(較少的acdb_id標簽)過濾到保留空間中。

匹配開頭的bit_width_configs標簽,打印出來。

獲取下一行並附加詳細信息。

bit_width附加到每個細節行。

去除任何人工制品並打印所有細節。

獲取並打印結束bit_width_configs標記。

退出處理。

sed -Ei '/<acdb_ids>/{:a;n;p;/<device/{s/ acdb.*//;H};/<\/acdb_ids/!ba;H;x;x}
     /<bit_width_configs/!b;n;p
     s/.* //;G;:b;s/^([^\n]*)(.*)"\n/\1\2" \1\n/;tb
     s/^.*\n\n(.*)\n.*/\1/p' audio_platform_info.xml
sed -Ei '/<bit_width_configs>/,/<\/bit_width_configs>/{G;/^([^\n]*). (\n.*)*\n\1(\n|$)/!{P;h};d}' audio_platform_info.xml
sed -i 's/<device name=".*"$/\
/g;/^$/!P;D;g' audio_platform_info.xml
sed -i '/^[[:space:]]*$/d' audio_platform_info.xml

現在這是我解決這個問題的方法,直到我或有人提出更好的解決方案。 其中, sed -Ei '/<bit_width_configs>/,/<\\/bit_width_configs>/{G;/^([^\\n]*)(\\n.*)*\\n\\1(\\n|$)/!{P;h};d}' audio_platform_info.xml由於 sed 在 busybox 中不同而sed -Ei '/<bit_width_configs>/,/<\\/bit_width_configs>/{G;/^([^\\n]*)(\\n.*)*\\n\\1(\\n|$)/!{P;h};d}' audio_platform_info.xml奇怪。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM