【问题标题】:Including break line in sed replacement在 sed 替换中包括断线
【发布时间】:2015-06-18 13:54:49
【问题描述】:

我有以下 sed 替换,如果在该行中找到某个字符串,它将用不同的文本替换整行。

sed "s/.*FOUNDSTRING.*/replacement \"text\" for line"/ test.txt

这很好用——但是,例如,我想在“for”之后添加一个新行。我最初的想法是试试这个:

sed "s/.*FOUNDSTRING.*/replacement \"text\" for \n line"/ test.txt

但这最终会替换为以下内容:

replacement "text" for n line

期望的结果:

replacement "text" for 
line

【问题讨论】:

  • 这是什么版本的 sed?你用的是什么外壳?你确定你有这样引用的 sed 模式吗?我希望在替换中使用未引用的\n(因为外壳会剥离它)。
  • 这应该可行,尽管您的报价可能会好一些。
  • @EtanReisner \n 被引用。
  • Mac OS X 自带 BSD sed,它无法处理替换子句中的 \n。如果你可以依赖 bash,你可以使用它的$'' C 风格的字符串,即sed $'s/.*FOUNDSTRING.*/replacement "text" for \n line/'
  • 对不起,我的错。它必须是\\\n(这最终是一个反斜杠,后跟一个换行符)。

标签: regex bash sed newline


【解决方案1】:

在 sed 中使用换行符可能会很痛苦。根据您使用的版本,行为也存在一些差异。为了简单和便携,我建议使用 awk:

awk '{print /FOUNDSTRING/ ? "replacement \"text\" for\nline" : $0}' file

如果模式匹配,则打印替换字符串,包括换行符,否则打印行 $0

测试一下:

$ cat file
blah
blah FOUNDSTRING blah
blah
$ awk '{print /FOUNDSTRING/ ? "replacement \"text\" for\nline" : $0}' file
blah
replacement "text" for
line
blah

当然,给猫剥皮的方法不止一种,如 cmets 所示:

awk '/FOUNDSTRING/ { $0 = "replacement \"text\" for \n line" } 1' file

当模式匹配时,这会将$0 行替换为新字符串,并使用通用速记1 打印每一行。

【讨论】:

  • 我建议awk '/FOUNDSTRING/ { $0 = "replacement \"text\" for \n line" } 1',但除了风格挑剔之外,我同意这是一个明智的解决方案。
猜你喜欢
  • 2020-06-12
  • 2016-11-25
  • 2012-08-25
  • 2020-12-13
  • 2013-01-26
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多