【问题标题】:capturing each word containing pattern regex捕获包含模式正则表达式的每个单词
【发布时间】:2018-05-27 10:29:51
【问题描述】:

我正在尝试编写一个 sed 脚本来查找包含特定模式的每个单词,然后将所有包含该模式的单词添加到前面。例如:

foobarbaz barfoobaz barbazfoo barbaz

可能变成:

quxfoobarbaz quxbarfoobaz quxbarbazfoo barbaz

我了解捕获组和反向引用的基础知识,但我仍然遇到问题。具体来说,我无法让它分别捕获每个完整的单词。

s/\(.*\)men\(.*\)/ not just the \1men\2, but the \1women\2 and \1children\2 too /

我尝试使用 \s,作为许多网站推荐的空格,但 sed 将 \s 视为单独的字符 \s

【问题讨论】:

  • 为什么要专门使用 sed?
  • @glennjackman SO 想要另一个标签,另外我不确定是否应该考虑一些与上下文相关的因素。正则表达式在任何地方都不一样。
  • \s 是 POSIX 字符类 [:space:] 的 GNU 简写,最常用于括号表达式,例如[[:space:]].

标签: regex sed


【解决方案1】:

您可以使用非空格字符\S,如下所示:

sed 's/\S*foo\S*/qux&/g' <<< "foobarbaz barfoobaz barbazfoo barbaz"

这将匹配包含foo 的单词。替换字符串qux&amp; 将在每个匹配的模式前面加上qux。输出:

quxfoobarbaz quxbarfoobaz quxbarbazfoo barbaz

【讨论】:

  • 当我使用它时,我得到了quxfoobarbaz barquxfoobaz barbazquxfoo barbaz
  • 可能你的sed版本不支持\S。尝试用字符类[a-zA-Z0-9_]替换\S
  • [a-zA-Z0-9_] 不是字符类,它是包含范围和字符列表的括号表达式。 [:alnum:] 是一个字符类,通常在括号表达式中用作[[:alnum:]_] 来表示“单词-组成字符”。 \S 的等价物是 [^[:space:]]
  • 我不知道字符类和括号表达式之间的区别。感谢您澄清这一点。
【解决方案2】:

如果每个单词中没有空格,它就可以正常工作。

echo "foobarbaz barfoobaz barbazfoo barbaz" | sed 's/\([^ ]*foo[^ ]*\)/qux\1/g'

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多