【问题标题】:Rename file containing '-' character with sed使用 sed 重命名包含 \'-\' 字符的文件
【发布时间】:2022-10-23 12:25:42
【问题描述】:

一系列文件名应采用以下格式:

ABCDEF - XY1234 - FileName.ext

(中间部分是固定长度(2 个字母 + 4 个数字),第一个和最后一个部分可以比示例更长或更短。扩展名始终是三个字母数字字符。)

但是,某些文件没有由空格包围的连字符:

EFGHI- WX2345 -FileName.ext
JKLMN-VW3456 - FileName.ext
OPQRS - UV4567- FileName.ext

有没有办法使用 sed 将所有这些组合“X -X”、“X-X”和“X-X”替换为“X - X”?

(我已经尝试了非空白字符后跟连字符的模式 - '\S\-' 作为我的模式,但是将其替换为空格后跟连字符 '\ \-' 然后意味着我丢失了由 '\S' 表示的字符。如果这可行,我的意图是通过三个变体传递每个文件名以确保合规性。)

【问题讨论】:

  • 请用您的实际/完整代码尝试更新问题以及文件重命名;你在使用bash/mv 循环吗?你在用rename吗?别的东西?
  • 除了连字符之前/之后,空格是否会出现在文件名中的其他任何地方?连字符可以出现在文件名的其他任何地方吗?
  • 连字符不会出现在文件名的其他任何地方,但空格将出现在可变长度部分中。我的问题与重命名机制无关,它与生成目标模式有关。

标签: regex awk sed


【解决方案1】:

有没有办法使用 sed 将所有这些组合“X -X”、“X-X”和“X-X”替换为“X - X”?

你可以使用这个 sed:

sed -E 's/[[:blank:]]*-[[:blank:]]*/ - /g' file

EFGHI - WX2345 - FileName.ext
JKLMN - VW3456 - FileName.ext
OPQRS - UV4567 - FileName.ext

分解:

  • [[:blank:]]*-[[:blank:]]*: 匹配 - 两边被 0 或空格包围
  • -:将其替换为-,两边用一个空格包围

一个 awk 解决方案是:

awk -F '[[:blank:]]*-[[:blank:]]*' -v OFS=' - ' '{$1=$1} 1' file

EFGHI - WX2345 - FileName.ext
JKLMN - VW3456 - FileName.ext
OPQRS - UV4567 - FileName.ext

甚至这个:

awk '{gsub(/[[:blank:]]*-[[:blank:]]*/, " - ")} 1' file

【讨论】:

  • 谢谢!这就是我想要的。我将看一下 awk 示例。如果我无法解决某些问题,我可能会带着问题回来;)
【解决方案2】:

假设:

  • 空白仅显示在连字符之前/之后
  • 文件名中只有 2 个连字符
  • 所有文件名都包含 2 个连字符

一个bash 使用参数替换来确定新文件名的想法:

while read -r fname
do
    newfname="${fname// /}"             # remove all spaces
    newfname="${newfname//-/ - }"       # add leading/trailing space to all hyphens
    # do something with (old) $fname and $newfname
done < <(printf "%s
" 'EFGHI- WX2345 -FileName.ext' 'JKLMN-VW3456 - FileName.ext' 'OPQRS - UV4567- FileName.ext')

笔记:

  • printf 仅在此处用于模拟将文件名列表提供给 while 循环
  • OP 会将printf 替换为生成文件名列表的任何命令(例如,findcat list_of_filenames.txt 等)

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2013-02-06
    • 2012-08-15
    • 1970-01-01
    • 2018-09-03
    • 2022-07-19
    • 2011-01-23
    相关资源
    最近更新 更多