【问题标题】:Backward search and replace using sed使用 sed 向后搜索和替换
【发布时间】:2013-09-26 18:30:24
【问题描述】:

如何在字符串中搜索特定单词/模式的最后一次出现并将其替换为另一个单词?

例如,搜索词是aaa,替换词是zzz

输入:aaa bbb ccc bbb aaa

所需输出:aaa bbb ccc bbb zzz

s/aaa/zzz/ 替换第一个单词。是否有任何其他选项可以反向搜索?

【问题讨论】:

  • 以您的示例为例,您可以将搜索模式锚定到行尾,即echo "aaa bbb ccc bbb aaa" | sed 's/aaa$/zzz/',但这就是所谓的脆弱解决方案。 (您可以使用 's/aaa[ ]*$/zzz/'. 在行尾考虑额外的空格,但仍然很脆弱;-))。祝你好运。
  • @shellter 如果我想用yyy 替换最后一次出现的bbb 怎么办? :P
  • 这就是为什么我说这是一个脆弱的解决方案,因为改变规范有危险;-)。很高兴你得到了答案。

标签: regex perl sed


【解决方案1】:

使用 sed:

x='aaa bbb ccc bbb aaa'
sed 's/\(.*\)bbb/\1zzz/' <<< "$x"

aaa bbb ccc zzz aaa

使用 perl 命令行:

sed 不支持环视,所以如果你想给 perl 一个机会:

perl -pe 's/aaa(?!.*?aaa)/zzz/' <<< "$x"

aaa bbb ccc bbb zzz

【讨论】:

  • 这不丑吗?我的意思是我希望一些开关或选项只是为了反向搜索。同样在很长的行的性能方面,这实际上不会搜索整个字符串吗?
  • 丑???至少它不需要编写一些复杂的命令就可以完成这项工作。你的线到底有多长?
  • 您的解决方案完美运行。没有任何论据。我只是出于好奇才问的。我没有计算确切的长度,但它在包裹时确实填满了整个屏幕!
  • 感谢您的确认。感谢您的回复。
  • sed 解决方案通常很难看。
【解决方案2】:

如果我们反转字符串,通过 sed 更改反转字符串中的第一次出现,然后将结果反转回正常顺序:

#!/bin/bash

str="aaa bbb ccc bbb aaa"
echo "${str}" | rev | sed 's/bbb/zzz/' | rev

如果我们只需要替换一个符号,它就可以正常工作。对于单词,您需要反转模式和替换单词。

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 2015-01-04
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2014-04-01
    相关资源
    最近更新 更多