搜索和替换问题

搜索和替换问题

我需要找到所有出现的AAsomeArbitraryStringBB并将其替换为CCsomeArbitraryStringDD.

所以

AAHelloBB
Text
AAByeByeBB

变成

CCHelloDD
Text
CCByeByeDD.

请务必注意,替换字符串包含搜索字符串的一部分。

答案1

这是命令的基本任务sed

sed 's/AA\(someArbitraryString\)BB/CC\1DD/g'

最后,如果您想对所有“任意字符串”执行此操作:

sed 's/AA\(.*\)BB/CC\1DD/g'

答案2

sed "s/\([AB]\)\1\1*/\n&\n/g
     s/AA\n\([[:alnum:]]\{1,\}\)\nBB/CC\1DD/g
     s/\n//g
" <<\INPUT
AAHelloBB Text AAByeByeBB
INPUT

我认为AA>>CC&&BB>>DD只有在两组之间有 1 个或多个字母数字字符时才应该进行替换,并且应该始终将可能出现的情况尽可能地靠近。

该示例打印:

CCHelloDD Text CCByeByeDD

其中最困难的部分是在第一个s///替换语句中完成的。它将eline 字符同时放置在模式空间中所有出现的\n头部和尾部。分隔有时可能很棘手 - 通常放置头端分隔符可能会改变尾端分隔符的位置,反之亦然。我尝试尽可能在单个范围内采取该步骤,以避免必须编辑编辑。AAA*BBB*

因此,我们将从里到外看它,但我们确实考虑到,sed对于结果模式的每次出现,都是从左到右扫描模式空间,因为我将lobal 标志附加到ubstitution 语句g的尾部。s///

  • [AB]-当扫描时遇到第一个或任何系列中的任何一个时,sed将暂停扫描。接下来它将寻找...AB
  • \([AB]\)\1\1*- 至少一个紧随其后的相同字符和任何/所有连续的相同字符,只要序列可以持续。我将[AB]字符类分组到\(子表达式中\),因此可以使用反向引用引用其内容\1
    • [AB]\{2,\}这与执行或什至不同,\([AB]\)\{2,\}因为在这些情况下sed会同时考虑AB来匹配模式。相反,这里添加到匹配组的所有字符都与 上的第一个匹配相同[AB]
  • \n&\n- 在替换的右侧,s///我引用刚刚匹配的整个序列&,并在其头部和尾部插入\newline 字符。
    • 许多seds 不支持\n替换右侧的 ewline 反斜杠转义。如果是这种情况,您可以简单地使用文字\newline 字符来代替n

以下是示例输入字符串的替换l结果:s///

\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n

可以看到除了插入额外的\newline 字符(这几乎是唯一一个只能sed在编辑后出现在模式空间中的字符) sed根本没有改变字符串 - 没有修改输入字符。

您还可以看到每个AAA*BBB*序列现在立即包含在\newlines 内。因此,当我进行下一次g全球s///替代时,我只需告诉sed...

  • AA\n- 仅在序列的尾部开始每场比赛,AAA*紧接着...
  • \([[:alnum:]]\{1,\}\)- 一个或多个字母数字字符。这永远不应该成为一个BBB*序列,因为AAA*紧接着的地方BBB*现在有\n它们之间有中间线。该字母数字序列后面必须紧跟...
  • \nBB- 序列的头端BBB*

而在右手边...

  • CC\1DD- 我们用其自身和w AA\n/ 替换 w/ 。CC \1\nBBDD

此时,一个l镜头揭示了……

\nCCHelloDD\n Text \nCCByeByeDD\n

...明显的成功!我们现在只需要做...

`s/\n//g`

...并删除所有剩余的\n行分隔符,工作就完成了。

这是我在键盘上随机敲击几秒钟呈现为输入的结果。这是一个复杂得多的输入示例,因此我\n在此处文档中使用转义的 ewlines 将其拆分。在将单行结果传递给sed输入之前,shell 将删除您可以在此处看到的所有换行符:

sed ... <<IN
AA  kj \
BB\
AAAAAABAkl\
AAAAasjd\
AAAAfo\
BB\
AAia\
BBsdfjomAl\
BBks\
BBmdlmdsviom\
BB\
AAiodsvgmnoi
IN

...以及l第一次s///替换后的 ook:

\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAAAA\nfo\nBB\n\nAA\nia\nBB\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi

...然后是第二个...

\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAACCfoDD\n\nCCiaDD\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi

...以及最终产品...

AA kj BBAAAAAABAklAAAAasjdAACCfoDDCCiaDDsdfjomAlBBksBBmdlmdsviomBBAAiodsvgmnoi

相关内容