2017-07-18 109 views
0

我有一個文本文件,其中有數千個銀行交易,我需要根據在另一行交易中找到的文本來搜索和替換文本。每個事務被列爲這樣...有條件查找和替換sed

2016/01/08 * POS DEBIT LOWES #02793* SPOKANE VALLE WA #7522 
    Expenses:Unknown       $289.78 
    Assets:INB Checking 

我需要能夠搜索上線「LOWES」,如果文本匹配它會改變費用列費用:建材

所以整個交易將喜歡這樣......

2016/01/08 * POS DEBIT LOWES #02793* SPOKANE VALLE WA #7522 
    Expenses:Building Materials    $289.78 
    Assets:INB Checking 

我知道我可以用sed做查找和替換,但我怎麼能這樣基於頂行模式匹配的?

+0

如果你顯示這些交易是如何分開的,那麼會更好? 'awk'更適合,但我認爲你的目的,使用'N'命令會做... – Sundeep

+0

交易之間沒有線路,它們只是按照顯示的方式繼續,沒有任何分離。 – freefly0313

+0

hmm ok ..我認爲使用sed的'n'或'N'命令可以在這裏找到..例如 – Sundeep

回答

0

您可以使用一個起始地址和循環與t命令來查找和替換的方式最多下一行不以數字開始:

sed '/LOWES/{:a;N;/\n[^0-9]/{s/\(Expenses:\).*/\1Building Materials/;P;D;}}' file 

嘗試-i標誌編輯文件到位

sed -i '/LOWES/{:a;N;/\n[^0-9]/{s/\(Expenses:\).*/\1Building Materials/;P;D;}}' file 
0

如果你可以假設每LOWES支出與線路匹配LOWES開始,以線配套費結束,你可以這樣做:

sed -e '/LOWES/,/Expenses/s/Unknown/Building Materials/'

這就是說從/ LOWES /每行範圍/費用/以「建材」替換爲「未知」。

如果您使用這樣一個更簡單的模式,而不是使用SLePort建議的更健壯的解決方案,則必須對結果進行區分並確保不會破壞別的東西。