regex - sed-从多行输入中仅获取替换的字符串,并忽略不匹配的行!

标签 regex sed replace multiline

我想sed忽略所有不匹配的行,而只输出(单个/多个预期行的)替换字符串。

换句话说:我有一个干草堆,只希望返回针头,而不是所有被搜索到并保持不变的干草。

或换句话说:在多行字符串中搜索/替换RegEx描述的字符串,仅返回该字符串。 (因为可以使用PHP函数http://www.php.net/manual/en/function.preg-replace.php

我当前的解决方法是先使用grep过滤,然后仅将匹配的行通过管道传输到sed中进行替换:

echo -e "Bla\nBla\nImportant1: One \nBla\nImportant2: Two\nBla\nBla" | egrep "^Important1.*$" | sed -E "s/^Important1: *\b(.*)\b */\1/g"
# From the multiple line input I only want the "One One" (with pre/post whitespace removed, hence matching the word boundaries with "\b")
# And I want no "Bla bla" lines in the result!


但是我想在sed中有一个解决方案。还是这超出了预期的sed用法,因此我应该更好地使用其他东西吗?顺便说一句,问题:multiline sed using backreferences似乎有某种联系,但我不确定!

最佳答案

编辑:以下已在Mac和Linux上进行了测试。

您可以像这样使用sed:

echo -e "Bla\nBla\nImportant1: One \nBla\nImportant2: Two\nBla\nBla" | \
   sed -n 's/^Important1: *\([^ ]*\) */\1/p'

OUTPUT:
one


说明

sed -n 's/^Important1: *\([^ ]*\) */\1/p'

-n # quiet / silent 

{
  s/^Important1: *\([^\ ]*\) */\1/ # replace "Important1: one " with 1st group i.e. "one"
  p                  # print the replaced text
}

关于regex - sed-从多行输入中仅获取替换的字符串,并忽略不匹配的行!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5544322/

相关文章:

java - 如何在不循环键的情况下检查嵌套 json 对象的键名称是否包含数字/特殊字符?

bash - 如何删除最后一次出现模式后的所有行?

javascript - 整理 Javascript,捕获和操作 URL

c# - 如何使用正则表达式 C# 替换空格(unicode 到 utf-8)

c++ - boost 正则表达式排除一个字符

正则表达式匹配任一关键字最后一次出现的所有内容

linux - 使用 SED 查找和替换 bash 脚本中的字符串

javascript - 修改格式模式以替换字符串中的占位符

regex - 使用 Perl 的正则表达式查找项目

bash - 从时间中删除秒数(awk,sed)