我有输入
bmb/eng/case.bmb
输出应该是这样的:
bmb/case.bmb
bmx/eng/case.bmx
我在这里使用的命令是
$ echo bmb/eng/case.bmb | sed -E 's/.*/& &/;:a;s/([^ ]* [^\n]*)(bm)b/\1\2x/;ta;s~/~&eng&~2'
bmb/eng/eng/case.bmb bmx/eng/case.bmx
我已经以多种方式修改了上述命令,但我没有得到预期的输出。
答案1
首先,一次做一件事更容易,因此使用 复制保留空间中的行h
,修改该行以生成第一个输出行,p
打印它,然后使用 恢复保存行g
并修改它以生成第二个输出行。
这允许您进行非常简单的替换,例如s/eng./&/
第一部分,或者s_/.*/__
目录可以具有任何名称或者可以是比一个层次结构更核心的目录。s/bmb/bmx/
第二行也很简单。
echo bmb/eng/case.bmb | sed 'h;s_/.*/_/_;p;g;s/bmb/bmx/g'
产生所需的输出。
您可以像使用文字处理器的剪贴板一样使用保留空间。这是一个非常通用且易于使用的工具,但遗憾的是,许多sed
用户没有使用它的功能。
答案2
它可以通过一个搜索替换命令来完成。
echo 'bmb/eng/case.bmb'|sed -r 's:^(bm)b(/[^/]+)(/.*\.\1)b$:\1b\3b\n\1x\2\3x:'
如果您使用()
对每个匹配片段进行分组,则可以从这些片段构建两条感兴趣的行,编号为 \1、\2 和 \3。