【问题标题】:bash - replacing string with sedbash - 用 sed 替换字符串
【发布时间】:2014-06-07 15:04:18
【问题描述】:

由于某种神秘的原因,我的 CSV 数据中的某些元素显示为 s/stWgvN52??f2& ?" 而不是 stWgvN522tw0JtZZnyXj,这会弄乱文件,因为我将 ; 设置为 CSV 分隔符。

我尝试使用sed 替换有缺陷的字符串,如下所示:

$ sed -i 's/stWgvN52??f2& ?"/stWgvN522tw0JtZZnyXj/g' file.csv

但我收到以下错误: sed: 1: "access_logs_2014-04.csv": 命令 a 需要 \ 后跟文本

是什么原因?

【问题讨论】:

标签: bash csv sed


【解决方案1】:

当您使用-i 选项时,您必须指定生成的备份文件的扩展名。 sed 的某些版本期望将扩展名直接附加到 -i 选项中,因此您编写的内容将起作用。但其他版本(如 OS X 上的版本)要求它是一个单独的选项,因此您必须编写:

sed -i '' 's/stWgvN52??f2& ?"/stWgvN522tw0JtZZnyXj/g' file.csv

指定您不需要备份文件。

【讨论】:

  • 如果你在一个普通的正则表达式中转义?,它的行为就像一个扩展的正则表达式,并成为一个接受零个或一个前面字符(GNU sed)的元字符。因此,除非您使用扩展的正则表达式开关 -r(在其他 sed 中可能是 -E),否则您不需要转义它。
  • 很难记住每个正则表达式变体的细节。我认为? 是一个基本的 RE,而不是扩展的 RE。
猜你喜欢
  • 2022-07-21
  • 2019-08-07
  • 2020-07-28
  • 2020-03-13
  • 2012-12-21
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多