【问题标题】:Replacing 1 character with sed用 sed 替换 1 个字符
【发布时间】:2021-09-23 21:36:02
【问题描述】:

我正在尝试使用 sed 使用正则表达式处理特定字符的更改。

本质上,我正在运行一个 bash 脚本,该脚本正在重命名具有特定字符串的文件,并且我需要使该字符串基本保持不变。这是一个示例文件名:

_FILE20210714.023.jpg

所以我正在尝试创建一个变量nfile 用于mv 命令并将其转换为以下内容:

_FILE20210714.123.jpg

请记住,我只想将最后的 0 更改为 1。

我想出了以下正则表达式来获取该特定字符,但我不知道如何用 sed 替换:

_FILE\d{8}\.\K0

nfile=$(echo ${file}| sed -e 's/_FILE\d{8}\.\K0/_FILE\d{8}\.\K1/')

当我回显nfile 变量时,我得到了原始名称,但我不确定如何解决这个问题。

echo ${file}
echo ${nfile}
/home/user/_FILE20210714.023.jpg
/home/user/_FILE20210714.023.jpg

一旦我可以将023 替换为123 就非常重要了,唯一的问题是我有多个以.034.jpg 结尾的文件,所以我不能直接匹配它。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    sed 不支持\d 转义序列,您需要使用[0-9]

    除非您使用-E 选项,否则您必须转义{} 量词。

    sed 不支持\K,但我认为这里不需要。

    您需要使用捕获组将数字从原始名称复制到替换名称。

    nfile=$(echo "${file}"| sed -E -e 's/(_FILE[0-9]{8}\.)0/\11/')
    

    【讨论】:

    • 感谢一堆工作。那么在这种情况下,哪个部分在复制捕获组?是被转义的额外 1 吗?
    • 是的,\1 表示复制捕获组 1。
    【解决方案2】:

    对于这种特殊情况,一个简单的参数替换就足够了:

    for file in '_FILE20210714.023.jpg' '/home/user/_ACH20210714.023.jpg'
    do
        nfile="${file//.0/.1}"
        echo "######################"
        echo " file: ${file}"
        echo "nfile: ${nfile}"
    done
    

    这会生成:

    ######################
     file: _FILE20210714.023.jpg
    nfile: _FILE20210714.123.jpg
    ######################
     file: /home/user/_ACH20210714.023.jpg
    nfile: /home/user/_ACH20210714.123.jpg
    

    【讨论】:

      【解决方案3】:

      如果你的系统上有the perl rename,你会写

      rename -v 's/\.0(\d+\.jpg)$/.1$1/' *.jpg
      

      自从你标记了

      newname () {
          local parts=() IFS="."
          read -ra parts <<< "$1"
          parts[1]="1${parts[1]#0}"
          echo "${parts[*]}"
      }
      
      for file in *.jpg; do
          mv -v "$file" "$(newname "$file")"
      done
      

      【讨论】:

      • Glenn 我非常感谢您添加的功能。我试图分解命令以了解它的功能。我看到您在清理条目后将东西放入数组中,但我对这总体上是如何工作的感到困惑。如果您能提供详细信息,我将不胜感激。
      猜你喜欢
      • 2016-11-15
      • 2011-05-17
      • 2020-01-12
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多