【问题标题】:Conditional string substitution in a bash scriptbash 脚本中的条件字符串替换
【发布时间】:2015-01-16 02:17:03
【问题描述】:

我是 bash 脚本的新手,我正在尝试对大型 CSV 文件中的数据进行大量更新。

文件结构为:

date|id|id|000000|string_type|0|0|0.00|0|0|0|0|0|0|string_subtype.

改变的是string_subtype,有时是string_type。

当我只更改 string_subtype 值时:

sed -i 's/string_subtype_old/string_subtype_new/g' $file

没有问题。

问题是当我同时更改单个行的 string_type 和 sub_type 时,所有具有相同 string_type 的记录的 sub_type 都会更改

例子

来自

date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeA
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeA
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeB
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeB
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeC
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeC

date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeD
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeD
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeE
date|id|id|000000|typeA|0|0|0.00|0|0|0|0|0|0|subtypeE
date|id|id|000000|typeB|0|0|0.00|0|0|0|0|0|0|subtypeF
date|id|id|000000|typeB|0|0|0.00|0|0|0|0|0|0|subtypeF

我试过了

sed -e 's/string_type_old/string_type_new/g' -e 's/string_subtype_old/string_subtype_new/g' $file

但是所有 string_type_old 都被改变了!

有什么建议吗?

--编辑--

真实例子:

来自

2014-01-01|000fc55|297633835|122350|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_CLEAN
2014-01-01|000fc56|297633835|122377|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_STORA
2014-01-01|000fc57|297633835|122378|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_OTHER
2014-01-01|000fc58|297633835|122428|WHOME|0|0|0.00|2|0|0|0|0|0|WHOME_KGADG
2014-01-01|000fc59|297633835|120776|WHOME|1|0|0.00|0|0|0|0|0|0|WFOOD_GOURT

2014-01-01|000fc55|297633835|122350|WHOME|0|0|0.00|2|0|0|0|0|0|W_CLEAN
2014-01-01|000fc56|297633835|122377|WHOME|0|0|0.00|2|0|0|0|0|0|W_STORA
2014-01-01|000fc57|297633835|122378|WHOME|0|0|0.00|2|0|0|0|0|0|W_OTHER
2014-01-01|000fc58|297633835|122428|WGADG|0|0|0.00|2|0|0|0|0|0|W_KGADG
2014-01-01|000fc59|297633835|120776|WFOOD|1|0|0.00|0|0|0|0|0|0|W_GOURT

Raws 1 到 3 很简单

sed -i 's/WHOME_CLEAN/W_CLEAN/g' $file

sed -i 's/WHOME_STORA/W_STORA/g' $file

sed -i 's/WHOME_OTHER/W_OTHER/g' $file

在 raws 4 和 5 中,我需要在 WGADG 或 WFOOD 中更改主要类型 WHOME。

sed -e 's/WHOME/WGADG/g' -e 's/WHOME_KGADG/W_KGADG/g' $file

WHOME 的所有原始数据都已更改!我需要一些命令来过滤,如 grep,只有 type==WHOME && subtype==WGADG

【问题讨论】:

  • 你能给出实际的示例输入和你使用的显示问题的 sed 命令吗?
  • 您的sed 命令显示string_type_oldstring_subtype_old 不在您的输入/输出文件中。

标签: regex bash shell sed scripting


【解决方案1】:

您只能像这样指定更改子类型一次:

sed '0,/string_subtype_old/s/string_subtype_old/string_subtype_new/'

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2023-04-01
    • 2019-11-03
    • 1970-01-01
    • 2014-02-17
    • 2017-09-06
    相关资源
    最近更新 更多