【问题标题】:awk condition on whether pattern is matched关于模式是否匹配的 awk 条件
【发布时间】:2016-09-20 13:08:52
【问题描述】:

如果匹配或返回原始行,我正在尝试让 awk 更改给定的模式。这是我的代码

printf 'hello,"hru, bro"\nhi,bye\n' | gawk 'match($0, /"([^"]+)"/, m) {if (m[1] == "") {print $0} else {print gsub(/,/,"",m[1])}}'

-> 1

我希望 `match 返回 m[1] 中的匹配模式,并且 gsub 在匹配时替换 m[1] 中的所有 ','。因此结果应该是

-> hello,hru bro\nhi,bye

我在这里缺少什么?

更新

根据 Tom 的评论,我将 gsub 替换为 gensub,但我现在得到以下结果:

-> gawk: cmd. line:1: (FILENAME=- FNR=1) warning: gensub: third argument `hru, bro' treated as 1
hello"hru, bro" 

【问题讨论】:

  • 好的,谢谢,我应该检查文档并改用gensub。所以我删除了这个问题,因为它很愚蠢。
  • 其实并没有解决问题,我已经相应地更新了我的帖子。
  • 您现在向 gensub() 传递了错误的参数,就像警告消息告诉您的那样,但是由于您没有向我们展示该代码,因此我们无法告诉您更多信息。
  • 看起来您正在尝试使用 CSV 文件。当您正在学习时,它们可能会非常棘手。我建议使用具有经过测试的 CSV 库的语言。 Perl 和 Ruby 浮现在脑海中。

标签: awk gsub


【解决方案1】:

gsub 改变第三个参数并返回替换的数量 - 在本例中为 1

我建议将您的代码更改为以下内容:

awk 'match($0, /([^"]*")([^"]+)(".*)/, m) { 
    $0 = m[1] gensub(/,/, "", "g", m[2]) m[3] 
} 1'

如果行中有任何被引号包围的内容,则重建它,使用gensub 从中间捕获的组中删除逗号(即双引号之间的部分)。

请注意,gensub 有 4 个参数,其中第三个用于指定要进行的替换次数("g" 表示 全局)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多