【问题标题】:How to replace in file SQL specific lines?如何替换文件中的 SQL 特定行?
【发布时间】:2020-12-29 04:17:27
【问题描述】:

在询问之前我尝试了一些 sed 和 awk,但没有成功,所以我在这里。

我希望用它来替换 bash 脚本中的一些行(在 .sql 文件中)。问题是我看到它带有特定于 SQL 的反引号,并且可能带有单引号?

实际要做的就是替换行之类的

`payment_methods` text COLLATE utf8_unicode_ci DEFAULT '-1',

`payment_methods` text COLLATE utf8_unicode_ci,

SQL 转储约为 10 Gb。

sed -i 's/`payment_methods` text COLLATE utf8_unicode_ci DEFAULT '-1',/`payment_methods` text COLLATE utf8_unicode_ci,/' file.sql

或使用行号:

sed -i '357s/.*/`payment_methods` text COLLATE utf8_unicode_ci,/' file.sql
awk 'NR==357 {$0="`payment_methods` text COLLATE utf8_unicode_ci,"} 1' file.sql

还忘了提到在转义字符上使用反斜杠没有帮助。

【问题讨论】:

  • 您的第一次sed 尝试将失败,因为您不能嵌套单引号。另外两个在我看来他们应该工作。请尝试提供minimal reproducible example
  • 您只是想从 payment_methods 列中删除“DEFAULT '-1'”部分吗?还是在任何地方?

标签: awk sed


【解决方案1】:

对于您展示的示例,您能否尝试以下操作。

awk 'FNR==357{sub(/ DEFAULT \047-1\047,/,"")} 1' Input_file

如果您也想验证第 357 行的内容及其行号,请尝试以下操作。

awk '
FNR==357 && /`payment_methods` text COLLATE utf8_unicode_ci DEFAULT \047-1\047,/{
  sub(/ DEFAULT \047-1\047,/,"")
}
1' Input_file

注意:这将在终端上打印行,一旦您对结果感到满意,您可以将 > temp && mv temp Input_file 附加到上述解决方案中,以将输出保存到 Input_file 本身。

【讨论】:

  • 谢谢!是否可以在不打印文件中所有行的情况下测试您的代码?
  • @YevhenOrestov,一定要试试awk 'FNR==357{sub(/ DEFAULT \047-1\047,/,"");print}' Input_file,这将只打印特定的行,同样适用于我的 OR 解决方案,让我知道它是怎么回事?
【解决方案2】:

使用 sed:

sed -rn "357s/(^.*payment_methods.*text COLLATE utf8_unicode_ci)( DEFAULT.*-1.*)(,$)/\1\3/p" file

根据正则表达式将第 357 行拆分为 3 段,然后用该行替换第一段和第三段,打印结果。

要将更改提交回文件,请添加 -i 等:

sed -ri "357s/(^.*payment_methods.*text COLLATE utf8_unicode_ci)( DEFAULT.*-1.*)(,$)/\1\3/" file

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多