【问题标题】:awk/sed on csv with #text带有#text的csv上的awk / sed
【发布时间】:2020-07-20 22:37:41
【问题描述】:

我是这里的新手,所以任何指示都会有所帮助。有一个 csv 文件(逗号分隔),并且在其中一列中有用 # 符号分隔的文本(该列由 # 自己分隔)。这是一行的示例:

text,text devicetype,cidr,text#more text#XXXX|more
text#even more text#more
text#text_toreplace#text|text#text

text_toreplace 是我想要用不同的文本替换的内容,而不更改列中值为“text#more text#XXXX|more text#even more text#more text#text_toreplace#text|text#”的所有其余数据文字”

CSV 确实有第一个 raw 作为标题,之后会有多行。

样本输出将与由 # 限定的 coumn 和一个值差异完全相同:

text,text devicetype,cidr,text#more text#XXXX|more
text#even more text#more
text#REPLACED_TEXT#text|text#text

想法

【问题讨论】:

  • here is a great sed introduction 使用regex crosswords 学习正则表达式很容易
  • 那么,字段有子字段(由#分隔)?如果您使用awk,您可以split()# 上的列,替换您想要的内容并将它们连接在一起。
  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 用建议的指令链接中的简单 sed 解决。
  • @Nixe.Kis 请分享您的解决方案作为答案。所以它会对其他人有所帮助。给一个男人正则表达式的解决方案,他会高兴一天。教他 sed 和 regex 终生快乐。 :P

标签: bash awk sed


【解决方案1】:

使用# 作为“主要”字段分隔符,遍历字段以替换有问题的文本。

awk -F'#' -v OFS='#' '{
    for (i=1; i<=NF; i++)
        if ($i == "text_toreplace")
            $i = "REPLACED_TEXT"
    print
}' <<'END_INPUT'
text,text devicetype,cidr,text#more text#XXXX|more
text#even more text#more
text#text_toreplace#text|text#text
END_INPUT
text,text devicetype,cidr,text#more text#XXXX|more
text#even more text#more
text#REPLACED_TEXT#text|text#text

【讨论】:

    【解决方案2】:

    sed 会更容易

    $ sed -E 's/(^|#)(text_toreplace)(#|$)/\1REPLACED_TEXT\3/g' file
    

    匹配第一个和最后一个字段所需的锚。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2017-04-23
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多