合併 2 sed 而不儲存檔案中的更改

合併 2 sed 而不儲存檔案中的更改

在使用 sed 讀取和搜尋檔案 word 並註解包含 word 的行然後儲存時,是否可以從檔案中刪除像 \ 這樣的特殊符號,但 \ 將就位?

我的意思是我有一個包含公司名稱(2 個單字)的文件,它們之間可以有一些字符,並且在原始文件中對這些符號使用字符轉義(正則表達式)。例如

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

我用 \ 替換任何內容並發表評論,但我也想像以前一樣用 \ 保存。我想要的輸出:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

我的腳本是:

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

但它保存時沒有 \.是的,我知道我可以,不刪除,只搜尋“Red\\\\ Park”。但是,如果我有20 個名稱,我不想為每個由2-3 個單字組成的公司名稱鍵入\\\\ :) 或者您可能有另一個願景,使用另一個命令(而不是sed)來完成此操作?我願意接受每一個建議或幫助 我有可能得到我想要的嗎?太感謝了!

答案1

如果我理解正確,讓我們看看這是否適合您:

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

輸出:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

答案2

都說堅持是一種美德.....

我假設所有 2 個名稱公司均由\\和 1 個字元分隔,並且國家/地區始終為大寫字母,所有公司至少包含一個小寫字母,即公司不能是國家/地區的子字串。

解決awk方案(如果您支援該-i inplace選項);我相信大多數人都會

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

演練

告訴awk進行更改-i inplace並將您的國家/地區和公司作為變數傳遞-v。由於您\\的文件中後面有一個未知的分隔符,因此請.在公司名稱的兩個部分之間使用

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

將字段分隔符號設為中斷,\這將為您提供\\出現的 3 個字段,然後設定

        OFS="\\"} 

如果出現中斷,則在列印時將它們放回原處。

如果第一個欄位$1==country是比賽的第一部分。

對於公司,檢查您是否拆分\並最終獲得多個字段NR>1,然後根據情況對最後 2 個字段或未拆分字段進行測試。

如果我們有匹配項printf #(即列印時不帶換行符)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

如果您有多個字段,NF>1那麼您會在公司名稱之間進行拆分,並希望在列印時\\?確保該字段是空格,因此請刪除最後一個字段的第一個字元並將其替換為空格?

    NF>1{$NF=" "substr($NF,2)

並列印

;1' file1

相關內容