1

我有一个文件,其中包含s3bin sync以下格式的输出

Sync: s3://my-bin-url/source/000/000/001.jpg -> s3://my-bin-url/400/x/000/000/001.jpg
Sync: s3://my-bin-url/source/000/000/002.jpg -> s3://my-bin-url/400/x/000/000/002.jpg
Sync: s3://my-bin-url/source/000/000/003.jpg -> s3://my-bin-url/400/x/000/000/003.jpg

我希望最终得到一个包含以下内容的文件

000/000/001.jpg
000/000/002.jpg
000/000/003.jpg

我正在尝试sed使用以下命令来执行此操作。这包含在#!/bin/sh脚本中,并且$2对应于绝对文件路径。该文件始终存在。

sed --in-place --regexp-extended '/.*((?:[0-9]{3}\/){2}[0-9]{3}\.jpg)/\1/gi' $2

当我执行脚本时,我收到以下错误消息

sed: -e expression #1, char 36: Invalid preceding regular expression

到目前为止,尝试查找此问题尚未产生任何有用的响应,只有建议围绕确保/转义(它是)和转义{}(这似乎仅在不使用时适用--regexp-extended

4

2 回答 2

2

您的 sed 命令可能在开始时缺少s命令。

您也可以在 reg 中使用备用正则表达式分隔符并避免转义/

这个 sed 应该工作:

sed -i -r 's#.*(([0-9]{3}/){2}[0-9]{3}\.jpg)#\1#i' file
于 2013-08-07T15:09:11.150 回答
0

如果您只想提取这些文件名但不覆盖文件,则可以使用 grep:

grep -o '[0-9]\+/[0-9]\+/[0-9]\+\.jpg$' filename
grep -oP '\d+/\d+/\d+\.jpg$' filename
于 2013-08-07T15:31:45.047 回答