【问题标题】:sed command to replace pattern&(\n) not working Terminalsed 命令替换模式&(\n) 不工作终端
【发布时间】:2014-11-18 11:02:49
【问题描述】:

试图替换以“\n”换行符结尾的特定模式,但似乎无法弄清楚。但我需要能够将结果通过管道传递给另一个命令,并且它不在文件中。

例子:

$echo "test
some text testing
test
some text testing
test" | sed 's/ testing\n/|/g' | (more commands)

预期结果是:

test
some text|test
some text|test

【问题讨论】:

  • 这是多行 sed 的任务..

标签: regex bash shell sed terminal


【解决方案1】:
echo "test
some text testing
test
some text testing
test" | sed '/testing/{N;s/ testing\n/|/;}'

我们在模式空间中查找与/testing/ 匹配的行,并使用N 将下一行附加到模式空间。这两行由\n 分隔。然后,我们继续进行简单的替换,即删除 testing\n 并将其替换为 |

【讨论】:

  • 尝试这样做时出错...:bad flag in substitute command: '}'
  • @double_j 看起来您使用的是 Mac。在} 之前放置一个;sed '/testing/{N;s/ testing\n*/|/g;}'。 BSD sed 需要 ;} 之前。
  • @Ram GNU sed 不会抱怨。 BSD sed 将。
  • @double_j 检查更新。第一种模式是隔离线。第二种模式是删除你不需要的部分。拉姆,我为您的回答添加了一些解释。如果您觉得它已经从根本上改变了它,请继续并恢复它。
  • @jaypal 非常感谢您让答案变得更好,我正要添加解释,这正是我的想法。
【解决方案2】:

如果您愿意接受其他建议,您可以使用 Perl 单线器来使用您的模式。

$ echo "test
> some text testing
> test
> some text testing
> test" | perl -pe 's/ testing\n/|/g'

test
some text|test
some text|test

【讨论】:

  • 我选择了@ram 回答,因为他仍在使用sed,但我也喜欢这种方法,可能会在其他地方结束使用它,谢谢!
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 2020-01-31
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
相关资源
最近更新 更多