首页 > 解决方案 > 如何使用 bash 脚本从文件中删除多个相同的字符?

问题描述

我有这个脚本,它从文件中删除第一个句点以取消隐藏它。但是,它所能做的只是删除第一个句点而不是后续句点,这使得文件仍然隐藏。我现在想知道的是如何一次删除多个句点以取消隐藏文件。

#!/bin/bash
period='.'
for i in $@; do
      if [[ "$i" == "$period"* ]] ; then
            mv "$i" "${i#"$period"}"
      else
            mv $i .${i}
      fi
 done

我对使用 grep 和 regex 有一些了解,所以我想用 + 一次删除很多,但我真的不知道这是否是正确的方法

标签: linuxbash

解决方案


您可以使用 bash 扩展 glob+(pattern)来匹配一个或多个句点,并结合##参数扩展来删除最长的前导匹配:

#!/usr/bin/env bash

# Turn on extended globs
shopt -s extglob

name=...foo
printf "%s -> %s\n" "$name" "${name##+(.)}"

或者您可以使用正则表达式,结合查找前导句点和捕获名称的其余部分:

#!/usr/bin/env bash

# Note the quoted parameters to avoid many issues.
for i in "$@"; do
      if [[ "$i" =~ ^\.+(.*) ]]; then
            mv "$i" "${BASH_REMATCH[1]}"
      else
            mv "$i" ".${i}"
      fi
 done

推荐阅读