我在使用它来替换文件路径的特定重复部分时遇到了一些麻烦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
从第二次开始的指令 =)/
。