簡體   English   中英

sed 如果一行匹配條件,則替換與模式范圍匹配的行

[英]sed to replace lines matched by a pattern range if one line match a condition

我需要刪除以下示例文件格式的記錄:

record {
    record {
        my_id_1
        my_name_1
    }
    
    record {
        my_id_2
        my_name_2
    }
    
    record {
        my_id_3
        my_name_3
    }
}

在這種情況下,我們需要使用唯一值my_idmy_id_2刪除所有記錄數據,預期結果應該是:

record {
    record {
        my_id_1
        my_name_1
    }
    
    record {
        my_id_3
        my_name_3
    }
}

注意:該文件不是一個標准的談論空格,換行符等。但核心邏輯可能是刪除單詞record [包括相同單詞]之間的所有內容,僅與括號中的my_id_*字符串相關。

到目前為止,我所能做的就是寫:

sed -n '/record/{:a;N;/}/!ba; /my_id_2/p}' file.conf

事實上,它找到了我需要的東西,但我無法刪除它我只打印我想要清除的行。

sed是我的主要選擇,但python regex可能很好,所以我可以將它傳遞給 ansible。

##########################

這也是我的 PYTHON 嘗試

##########################

工具: https://pythex.org/

使用 python 這是我得到的最接近的:

第一次嘗試: (?=my_id_2)([^}]+)(?=\})

匹配結果:

    `my_id_2 my_name_2`

然后稍作修改: (?=record )([^}]+)(?=\})

匹配結果:

Match 1

    `1. record { record { my_id_1 my_name_1`

Match 2

    `1. record { my_id_2 my_name_2`

Match 3

`1. record { my_id_3 my_name_3`

謝謝。

你可以試試:

$ sed -i.bak '/record/{:a;N;/}/!ba; /my_id_2/d}' file.conf
$ cat file.conf
record {
    record {
        my_id_1
        my_name_1
    }
    
    
    record {
        my_id_3
        my_name_3
    }
}

以上內容就地修改了文件並創建了文件的備份,名為file.conf.bak 如果您不需要原始文件的備份,您可以從-i.bak中刪除.bak

相信這可以滿足您的要求,但它會在前面加上一個空行。 它只是將它們作為段落括起來,然后刪除具有該記錄名稱的段落。

sed '/./{H;$!d} ;x; /my_id_2/d' file.conf

你會認為你可以簡單地用額外的; 1d ; 1d附加到您的 sed 語句。

sed '/./{H;$!d} ;x; /my_id_2/d ; 1d' file.conf

但是,這沒有任何效果,並且第 1 行仍然是空白的。 您可以通過將其傳遞給后續的sed命令來克服這個問題,但這似乎很不穩定。 也許其他人知道為什么。

sed '/./{H;$!d} ;x; /my_id_2/d' file.conf | sed '1d'

https://www.gnu.org/software/sed/manual/sed.html

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

sed -E '/record \{/{:a;N;/\}/!ba;/my_id_2/!b;s/(record \{.*)\1.*/\1/;t;d}' file

使用您的原始方法,但使用貪婪進行額外測試,如果成功,則保留匹配字符串的前面。 如果沒有這樣的匹配,恢復並像以前一樣刪除整個匹配的字符串。

注意這可能會引入一些不需要的填充,將其刪除作為練習留給讀者;-)

暫無
暫無

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

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