我需要找到所有出现的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
将暂停扫描。接下来它将寻找...A
B
\([AB]\)\1\1*
- 至少一个紧随其后的相同字符和任何/所有连续的相同字符,只要序列可以持续。我将[AB]
字符类分组到\(
子表达式中\)
,因此可以使用反向引用引用其内容\1
。[AB]\{2,\}
这与执行或什至不同,\([AB]\)\{2,\}
因为在这些情况下sed
会同时考虑A
和B
来匹配模式。相反,这里添加到匹配组的所有字符都与 上的第一个匹配相同[AB]
。
\n&\n
- 在替换的右侧,s///
我引用刚刚匹配的整个序列&
,并在其头部和尾部插入\n
ewline 字符。- 许多
sed
s 不支持\n
替换右侧的 ewline 反斜杠转义。如果是这种情况,您可以简单地使用文字\n
ewline 字符来代替n
。
- 许多
以下是示例输入字符串的替换l
结果:s///
\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n
可以看到除了插入额外的\n
ewline 字符(这几乎是唯一一个只能sed
在编辑后出现在模式空间中的字符) sed
根本没有改变字符串 - 没有修改输入字符。
您还可以看到每个AAA*
或BBB*
序列现在立即包含在\n
ewlines 内。因此,当我进行下一次g
全球s///
替代时,我只需告诉sed
...
AA\n
- 仅在序列的尾部开始每场比赛,AAA*
紧接着...\([[:alnum:]]\{1,\}\)
- 一个或多个字母数字字符。这永远不应该成为一个BBB*
序列,因为AAA*
紧接着的地方BBB*
现在有二\n
它们之间有中间线。该字母数字序列后面必须紧跟...\nBB
- 序列的头端BBB*
。
而在右手边...
CC\1DD
- 我们用其自身和wAA\n
/ 替换 w/ 。CC
\1
\nBB
DD
此时,一个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