需要 sed 命令帮助

需要 sed 命令帮助

我有输入

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。

相关内容