【问题标题】:Using bash (parameter expansion) to sanitize input file使用 bash(参数扩展)清理输入文件
【发布时间】:2020-07-21 03:09:58
【问题描述】:

我有一个具有如下功能的 bash 脚本:

sanitize(){

rb_reg="^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$"

if grep -Ex "${rb_reg}" "${1}/.ruby-version" > /dev/null 2>&1; then
  sanitize_tmp="$(<"${1}"/.ruby-version)" &&
    ruby_version="${sanitize_tmp//[^0-9\.]/}" &&
    echo "Setting Ruby Version: ${ruby_version}"
else
  echo "There was an error trying to sanitize a .ruby-version file"
  echo "The file was: ${1}/.ruby-version"
  exit 7
fi
}

我正在使用它来检查 .ruby-version 文件,然后将其中的版本设置为变量。 大多数情况下,这些文件将包含一些合理的内容,例如:2.0.0 可以正常工作。我想防御,不信任输入文件,所以尽可能检查/清理它。

两个问题:

如果由于某种原因,文件中有多个版本号位于多行,例如:

'2.0.0

1.0.0'

这会将它们粉碎在一起,当前正在删除空白并最终得到一个变量,例如:'2.0.01.0.0' 什么是只获取与正则表达式匹配的第一个版本号的好方法?

有没有更好的方法来做到这一点,也许完全在没有 grep 的 bash 中?感谢人们检查此类版本但不信任输入文件的任何示例。

【问题讨论】:

  • 第一种情况不会发生,因为您的正则表达式都锚定在行首和行尾,加上 grep 的 -x 选项要求整行匹配 - 除非可以有多行,否则是。
  • 啊,很好。通过编辑使其更加清晰。是的,对于第一种情况,我说的是文件中的多行。所以正则表达式匹配第一个示例,然后文件有其他行。

标签: regex bash shell grep


【解决方案1】:

我还在玩这个,但这是我最终要做的。 我将文件名作为参数传递给脚本中其他地方的函数。真的很喜欢 BASH_REMATCH 的概念,所以尽量避免使用 grep、sed、awk 等,而是这样做。

您可以在这里查看最新版本的代码:https://github.com/octopusnz/scripts

sanitize(){

  if [[ "${#}" -ne 1 ]]; then
    echo "[ERROR 7]: We expected 1 argument to the sanitize() function."
    echo "But we got ${#} instead."
    exit 7
  fi

  rbv_reg="^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{1,2})(-([a-z]{1,10}))?$"
  reg_matches=0

  while read -r rbv_line || [[ -n "$rbv_line" ]]; do

    if [[ "${rbv_line}" =~ ${rbv_reg} ]]; then
      ruby_version="${BASH_REMATCH[0]//[^0-9a-z\.\-]/}" &&
        ((reg_matches="${reg_matches}"+1)) &&
        echo "" &&
        echo "Setting Ruby version: ${ruby_version}" &&
        break
    fi
  done < "${1}"

  if [[ "${reg_matches}" -lt 1 ]]; then

    if [[ -v ruby_version ]]; then
      echo "We couldn't parse ${1} and set a valid Ruby version."
      echo "Using default: ${ruby_version}"
    else
      echo "We couldn't parse ${1} and set a default Ruby version."
      echo "[ERROR 4]: No valid .ruby-version file found."
      exit 4
    fi
  fi
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多