sed 搜索替换正则表达式模式以替换路径中的重复字符串

sed 搜索替换正则表达式模式以替换路径中的重复字符串

我在使用它来替换文件路径的特定重复部分时遇到了一些麻烦sed,我无论如何也无法弄清楚如何让它工作。

例如,假设我有一个文件路径列表:

输入.txt

gs://example-bucket/H20/H20AC0010001999B-01.jpg
gs://example-bucket/H20/H20AC0010001999B-02.jpg
gs://example-bucket/H20/H20AC0010001999B-03.jpg

我想保留文件夹结构但删除文件名本身中的相同引用:

理想输出.txt

gs://example-bucket/H20/AC0010001999B-01.jpg
gs://example-bucket/H20/AC0010001999B-02.jpg
gs://example-bucket/H20/AC0010001999B-03.jpg

我写了这个命令,它似乎在终端上不起作用(注意:使用 macOS 和 zsh),但它在https://sed.js.org(无论如何我并不期望它与 *nix 具有同等效果sed):

sed -E 's;/(.+)/\1;/\1/;' input.txt > output.txt

grep如果我使用(稍加修改以转义正斜杠)检查正则表达式,似乎工作正常:

cat input.txt | grep -E '\/(.+)\/\1'

上述命令的输出

我遗漏了或者没有正确使用哪些特别疯狂的细节?

答案1

如果H20部分是恒定的,我个人会使用:

sed -E 's_/H20/H20_/H20/_;' input.txt > output.txt

或者在您的用例中这部分可以完全随机吗?

此外,分隔符是否有可能;扰乱你的终端?

答案2

以下是在我的 kali bash 上使用 sed 的情况。它也能在您的 Mac 上使用 sed 吗?

sed 's/\/[AEHP][0-9]\{2\}/\//2g' input.txt > output.txt

它保持正则表达式的第一次出现\/[AEHP][0-9]\{2\},并用 char 替换任何其他出现(2g从第二次开始的指令 =)/

相关内容