2017-07-18 111 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建议的更健壮的解决方案,则必须对结果进行区分并确保不会破坏别的东西。