【问题标题】:sed any whole word search and replacesed 任何整个单词的搜索和替换
【发布时间】:2015-05-14 15:02:38
【问题描述】:

我们如何匹配输入文本中的any整个单词,然后将其替换为replaceString。 例如。我希望 sed 命令匹配输入文本中的任何单词,并将每个单词替换为“XXX”。

echo "bar embarrassment recommended" | sed "Please fill right answer here"

我想要这样的输出

XXX XXX XXX

我是 Linux 新手。因此,在这种情况下,可能还有其他一些命令可以在这里发挥最佳作用。有什么建议吗?

本题中一个词的定义很简单。它可以包含字母 a-z 或 A-Z,下划线。并且任何两个单词都由空格分隔。

例子

this is a sample text
This Is A Sample Text
this_ is_ a_ sample_ text_

【问题讨论】:

  • sed "s/please_fill_your_regexp_here/XXX/g"
  • 到目前为止的所有答案都假设跨行的连字符应被视为两个单词。在 sed 中识别特殊情况并区别对待是非常困难的,而且可能没有必要。但是你应该知道这个假设。
  • 在您的上下文中,word 是什么? 17 是一个词吗? that's 是一个字还是两个字? as-is 怎么样?单词总是用空格分隔吗?非单词字符应该保持原样还是删除或替换为空格?您是否关心保留单词之间的空白?编辑您的问题以定义 word 并包含一些您认为脚本难以正确处理的多字示例输入行和相关输出。
  • 我从您发布的示例中看到,您的输入由一系列被双引号包围的字母/下划线/空格组成(它们本身又被空白字符与其他双引号字符串分开)并且完全包含在一个线。好的,我知道了。现在预期的输出是什么样的?它是否保持在一条线上?双引号是保留还是删除?请编辑您的问题以准确显示与该输入相关的输出,以便我们可以根据您发布的示例输入测试我们可能的解决方案。

标签: linux sed


【解决方案1】:

matchew's helpful answer 包含一个 GNU sed 解决方案,这是合适的,因为您的问题被标记为

在评论中,您说您使用的是 Mac (OS X),它带有 BSD sed,在许多方面表现不同。

matchew 命令的 POSIX 兼容(因此跨平台)等效是:

echo "Bar Embarrassment Recommended." | sed 's/[[:alnum:]_]\{1,\}/XXX/g'

但是,请注意,这将匹配 any 边界上的单词,而不仅仅是 空格;即,由任何非单词字符连接的一系列单词字符将匹配,例如abc-de将变成XXX-XXX

【讨论】:

    【解决方案2】:

    编辑:

    echo "Bar Embarrassment Recommended." | sed -r 's/\w+/XXX/g'
    

    是你所追求的。在我最初阅读您的问题时,您需要将一个完整的单词简单地转换为 3 个 X 并不清楚。

    【讨论】:

    • 上述命令返回 this.XXX XXXXXXXXXXXXX XXXXXXXXXXXX 但我需要它像 XXX XXX XXX 一样,其中没有 XXX 等于没有输入文本中的单词
    • 原来的问题没有问题(好吧,也许是缺乏努力?:).. 我的意思是,它非常清楚......
    • @Phanendra 我的意思是差不多,但标点符号被保留了。这就是你要求的不?用X代替字母?哦,您的评论已被编辑。好的,我明白你的意思了。
    • @KarolyHorvath 我并不是说他的问题不清楚。只是表明他的输入可能并不总是那么规律。而且他正在寻找的概念是正则表达式。
    • @Phanendra 我已经更新了我的答案以反映您的评论。对此感到抱歉。
    【解决方案3】:

    您可以使用awk。它将所有单词替换为xxx

    echo "bar embarrassment recommended" | awk '{for (i=1;i<NF;i++) printf "xxx ";print "xxx"}' file
    xxx xxx xxx
    

    【讨论】:

    • 这替换了所有运行的 non-whitespace 字符,这与 OP 要求的不太一样。此外,它还标准化了可能需要也可能不需要的空白。
    【解决方案4】:

    您可以像这样逐字匹配任何整个单词:

     echo "酒吧尴尬推荐" | sed 's/\b\S\+\b/XXX/g' 

    【讨论】:

    • 不会改变任何东西。
    • 元字符 + 需要转义,即 \+,除非已调用 -r 开关。 \b 元字符也是不必要的,因为\S 表示任何不是空格的字符,即\s 的补码。
    • 只有部分 sed 支持\b\S
    • 好吧,那是因为我忘了在特殊标签中举我的例子。至于 \S - 它匹配任何非空白字符。但是在 \b\b 之间它缩短了符号并且不影响标点符号
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多