【问题标题】:sed not replacing as expectedsed 没有按预期替换
【发布时间】:2017-12-04 22:58:46
【问题描述】:

为什么我得到与输入相同的输出,而我期望“搜索替换主题”作为输出:

x="search='some thing' replace='something' subject=/path"

echo $x
echo "$x" | sed 's/\(\w+\)=/\1\n/g'

【问题讨论】:

  • \w+ 是扩展的正则表达式,您必须将-r 选项与sed 一起使用。如果这样做,您也不需要转义括号。

标签: linux bash sed


【解决方案1】:

默认情况下sed 使用旧式正则表达式。如果您想要新样式(又名“扩展”)正则表达式,您应该使用sed -r。无论如何,您正在使用旧式和新式正则表达式的混合,这永远不会起作用(您不能同时拥有\(...\)+);所以要么

sed -e 's/\(\w\+\)=/\1\n/g'

sed -re 's/(\w+)=/\1\n/g'

以上任何一种都会产生

search
'some thing' replace
'something' subject
/path

如果您实际上期望输出为search replace subject 那么

sed -re "s/=('[^']*'|[^']\\S*)//g"

即删除等号后跟的所有匹配项

  • ' 任意数量的非' 和最终的'
  • 以除' 以外的任何内容开头的 1 个或多个非空格的序列。

(但这与原始问题中的正则表达式无关。我无法将所需的输出与问题中的正则表达式相关联。)

【讨论】:

  • 我确实期待“搜索替换主题”作为输出。
  • @AdamSilver:查看更新的答案。但是,此所需输出与问题中的正则表达式之间没有关系;问题中的正则表达式似乎想将输入分成多行——否则,替换字符串中的\n 应该做什么?所需的输出想要删除输入的某些部分,因此替换字符串应为空。
  • 抱歉给您带来了困惑。这就是我想要的。
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 2016-12-24
  • 2014-09-22
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多