gpt4 book ai didi

regex - 检查字符串是否可以是 linux 和 windows 上 FS 中的路径

转载 作者:可可西里 更新时间:2023-11-01 09:33:08 32 4
gpt4 key购买 nike

我正在尝试编写一个 bash 脚本,我必须在其中读取用户输入的字符串。我需要允许此字符串成为可以在 linux 和 windows 上适当访问的适当路径(父目录的分支和目标文件或目录)。

它是关于目录名和文件名的。我需要它们同时满足 linux 和 windows 的要求。我知道在 Linux 中使用 bash 4.x(也许 4 不是决定性的)允许创建包含任何字符的任何名称的文件,但我在访问此类文件时可能会遇到问题。

到目前为止,我知道:

  • 与 linux 不同,windows 无法访问名称中包含冒号的文件
  • 与 Windows 不同,Linux 访问名称中带有感叹号的文件时可能会出现问题
  • windows 不允许只包含空格的名称
  • linux 和 windows 都不允许“.”和“..”名字
  • windows 不允许只包含点的名称

等等

是否有 POSIX 标准或一些规则或同时适合 linux 和 windows 要求的东西?两者都允许使用哪些字符,哪些是异常(exception)?

此外,我无法检查字符串是否是适合的路径。我想我可以使用字母数字字符、下划线、连字符、圆括号、波浪号、空格、点。我还假设路径应该以斜杠开头而不是以斜杠结尾。

我试过像这样的正则表达式,但它们没有像我希望的那样工作:

[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\ \(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]

我只是不了解 bash 正则表达式的所有特性。

那么,什么是要求以及验证它们的更好方法是什么?

最佳答案

我会编写一个白名单脚本,它接受 Windows 和 Unix 环境的路径名的最小公分母,但我想在文件前缀和分隔符方面必须区分 Windows 和 Unix 世界。

以下脚本可用作起点。您可以将路径作为第一个参数传递给脚本,当路径正常(即满足正则表达式)时返回 OK,或者当 path 不满足正则表达式时返回 NOK。

对于正则表达式匹配,我在脚本中使用了 egrep(选项 -x 意味着给定的字符串必须匹配整个字符串)。 $? 表示 egrep 的返回值 --- 如果为零,则参数 path 成功匹配正则表达式。

最好的, 朱利安

#!/bin/bash

DELIM="/"
FILE="[a-zA-Z]([a-zA-Z0-9])*"
R="(${DELIM})?${FILE}(${DELIM}${FILE})*${DELIM}?"

path=$1

echo "$path" | egrep -x "$R"

[ $? -eq 0 ] && {
echo "OK"
exit 0
}

echo "NOK"
exit 1

关于regex - 检查字符串是否可以是 linux 和 windows 上 FS 中的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35906643/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com