【问题标题】:conditional find and replace with sed有条件的查找并替换为 sed
【发布时间】:2017-07-18 02:53:14
【问题描述】:

我有一个包含数千笔银行交易的文本文件,我需要根据在交易的另一行找到的文本来搜索和替换文本。每笔交易都是这样列出的……

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 进行查找和替换,但是如何根据第一行的模式匹配来做到这一点?

【问题讨论】:

  • 如果你能展示这些交易是如何分开的会更好,例如中间有换行符? awk 更适合,但我认为出于您的目的,使用 N 命令可以...
  • 事务之间没有行,它们只是如图所示继续,没有任何分隔。
  • 嗯好吧..我认为使用 sed 的nN 命令适合这里.. 参见grymoire.com/Unix/Sed.html#uh-51 示例
  • 你的顶线是什么?带有LOWES 关键字的文件中的最新行或第一行?

标签: sed pattern-matching


【解决方案1】:

您可以使用起始地址并循环使用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

【讨论】:

    【解决方案2】:

    如果您可以假设每个 LOWES 费用都以匹配 LOWES 的行开始并以匹配费用的行结束,您可以这样做:

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

    这表示在从 /LOWES/ 到 /Expenses/ 的每一行范围内,将“未知”替换为“建筑材料”。

    如果您使用像这样更简单的模式而不是 SLePort 建议的更强大的解决方案,那么您必须区分结果并确保您没有破坏其他东西。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 2012-03-01
      • 2015-11-30
      • 2016-05-30
      • 1970-01-01
      • 2020-12-22
      • 2019-03-20
      • 2022-12-11
      相关资源
      最近更新 更多