【问题标题】:Sed regex to capture upto one word before the pattern string and after the stringSed 正则表达式在模式字符串之前和字符串之后最多捕获一个单词
【发布时间】:2022-02-01 19:42:28
【问题描述】:

以下只是模板示例。想要一个通用的正则表达式

此模板充当门户,帮助开发数据库“查询”,然后在 wiki 上运行它,它通过搜索链接实现此目的,该链接也可用于共享此类发现。这个模板也可以用来有“learn”,string“regular”,string“expression”,这个版本Cirrus Search的string语法。

正则表达式 1:

将组捕获到模式字符串。

例如:模式=查询

使用 sed 捕获组直到“查询”和“查询”之后,

[注意:查询后的逗号是可选的,可能存在也可能不存在,因此捕获组 1 应包含最多 query,捕获组 2 应包含 before."]

试过了:

sed 's/^(.*?)"query"(.*)/\1\2/g'

上面的作品。但是捕获组 2 包含我不想要逗号的逗号,并且逗号是可选的,需要像 [,] 一样使用。 以上需要帮助。

正则表达式 2:

在模式之前捕获最多一个单词

的组

例如:模式:“常规”

所以, 捕获组 1 应包含“学习”之前的所有文本,捕获组 2 包含所有内容,包括 字符串“表达式”

[意思是:不捕获,字符串“regular”,]

试过了:

sed 's/^(.*?)"\w"[^\"]*"regular"([^"]*)(.*)/\1\3/g' -rE 

但不工作。我用“\w”表示我想要的通用正则表达式。

正则表达式 3:关于 sed 中捕获组的查询

有没有办法搜索捕获的组或编辑捕获组本身

例如:sed -r '/(someword)(.*)/s/\1/something/g' 是否有类似或替代的可能

【问题讨论】:

  • Above works. 你错过了-r-E--regexp-extended 参数吗?
  • 另外关于 Above works - .*? 在 BRE 或 ERE 中是未定义的行为,因为它是一个重复字符 * (0-or-many),紧接着是另一个重复字符 ? (0-or-1) 所以 YMMV。
  • 关于-rE - -r 在旧版本的 GNU sed 中激活 ERE,而-E 在新版本的 GNU sed 和 BSD sed 中激活 ERE。两者都用是没有意义的。关于I have used "\w" for generalised regex - 假设您希望\w 表示“单词组成字符”,这不是它的一般含义,当一般使用时(即不使用GNU sed),它表示文字字符w。如果您通常(即可移植)想要 POSIX 标准定义的“单词一致字符”,那就是 [[:alnum:]_]

标签: sed


【解决方案1】:

有没有办法搜索捕获的组或编辑捕获组本身

您可以将模式空间拆分为块,将其保留为保留空间,仅提取感兴趣的部分,对其进行编辑,然后收回保留空间并将模式空间重新洗牌。

s/\(someword\)\(.*\)/\n\2\n\1/   # split pattern space into chunks
h                                # hold it to hold space
s/.*\n//                         # extract only interested part
s/.*/something/                  # do edit on it
G                                # take hold space back
s/\([^\n]*\)\n\([^\n]*\)\n\([^\n]*\).*/\2\1\3/    # shuffle

上面我使用换行符作为块分隔符。旁注,在replacement 部分s 命令中使用\n 通常是对POSIX 的扩展,但我认为适用于任何地方。

想要一个通用的正则表达式

使用真正的编程语言,标记化输入并处理标记然后输出它们。 Python、Perl、AWK 等着你。


捕获的组有“word,word2”,我想删除,

以下脚本:

#!/bin/bash
sed '
  s/\(word,word\)\(.*\)/\n\2\n\1/
  h
  s/.*\n//
  s/,//
  G
  s/\([^\n]*\)\n\([^\n]*\)\n\([^\n]*\).*/\2\1\3/
' <<<'stuff1, word,word ,stuff2'

输出:

stuff1, wordword ,stuff2

【讨论】:

  • 好的。但是如果我想编辑捕获的单词怎么办。例如。捕获的组有“word,word2”,我想删除,
  • You can split pattern space into chunks, hold it to hold space, extract only捕获的单词,然后用s/,//then take hold space back and shuffle pattern space back to original line编辑捕获的单词。你可以在grymoire.com/Unix/Sed.html 学习 sed。
  • 谢谢。现在我明白了 sed 的工作原理。必须可视化逻辑,然后应用语法。但是你能解释一下为什么 sed 's/^(.*?)"\w"[^\"]*"regular"([^"]*)(.*)/\1\3/g' -rE 不是工作
  • why isnt working 输入是什么? “不工作”是什么意思?它应该“正在工作” - 但不是期望的方式。您希望它如何工作,或者最终目标应该是什么? ||如果您从一开始就匹配^,那么使用global 标志很奇怪。并使用-E-r,它们的作用相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 2011-10-06
  • 2020-03-23
  • 2018-04-30
  • 1970-01-01
相关资源
最近更新 更多