AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 417194
Accepted
Freedo
Freedo
Asked: 2018-01-16 00:50:54 +0800 CST2018-01-16 00:50:54 +0800 CST 2018-01-16 00:50:54 +0800 CST

匹配bash中语言代码的正则表达式

  • 772

stackoverflow中有一个类似的问题,但它不适用于 bash。

需要什么才能使其与 bash 一起使用,与脚本/变量一起使用?

我说的是 ISO 639-1 或 ISO 639-2 代码。

我的 bash 是 GNU 4.3。

例子:

root@box ~/test2 # ls
eng  en-US  por pt-BR

该页面中的正则表达式失败:

root@box ~/test2 # ls | grep ^[a-z]{2}-[A-Z]{2}$
root@box ~/test2 # ls | grep ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep ^[a-z]{2}(-[A-Z]{2})*
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep "^[a-z]{2}(-[A-Z]{2})*"
bash shell-script
  • 3 3 个回答
  • 1553 Views

3 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2018-01-16T01:17:02+08:002018-01-16T01:17:02+08:00

    {n}没有反斜杠是扩展正则表达式的一部分,因此您需要-Egrep 的标志。此外,您想引用正则表达式,因为如您所见,括号和大括号对 shell 具有特殊含义。

    $ ls
    eng  en-US  por  pt-BR
    
    $ printf "%s\n" * | grep -E '^[a-z]{2}-[A-Z]{2}$'
    en-US
    pt-BR
    
    $ printf "%s\n" * | grep -E '^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$'
    eng
    en-US
    por
    pt-BR
    

    或者只使用 Bash:

    $ for f in * ; do 
       [[ $f =~ ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$ ]] && printf "%s\n" "$f" ; done
    eng
    en-US
    por
    pt-BR
    

    ([[ .. ]]测试构造很特殊,大括号和圆括号在其中有不同的含义,实际上这里的正则表达式必须不加引号。请注意,这与 完全不同[ .. ]。参见例如BashGuide on conditionals)


    该[a-zA-Z]{1,8}部分匹配最多八个字母的字符串,最后*允许括号中组的任意重复次数,所以这也匹配类似的东西foobar-foobar-foobar。

    我们可以将模式更改为^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,3})?$仅允许包含两个或三个字母和一个尾随-xx部分的代码,如果这就是您所需要的。


    未引用{1,8}的是大括号扩展:

    $ echo ^[A-Za-z]{1,8}
    ^[A-Za-z]1 ^[A-Za-z]8
    

    并且未引用[]的是文件名模式匹配(glob) ...

    $ touch "^a1" "^b8"
    $ echo ^[A-Za-z]{1,8}
    ^a1 ^b8
    
    • 4
  2. George Vasiliou
    2018-01-16T01:17:05+08:002018-01-16T01:17:05+08:00

    首先,您需要regex根据 grep 要求引用使用grep 'regex'

    然后,您将在 grep 中使用扩展的正则表达式支持,egrep或者grep -E,这将正常工作:

    $ ls | egrep '^[a-z]{2}-[A-Z]{2}$'
    

    或者您可以使用经典的 grep - 基本正则表达式,但您需要转义{并且}:

    $ ls | grep '^[a-z]\{2\}-[A-Z]\{2\}$'
    

    根据您的问题,对于这些数据

    $ ls
    eng
    en-US
    main.sh
    por
    pt-BR
    

    两种 grep 情况下的输出将是

    en-US
    pt-BR
    
    • 2
  3. Philippos
    2018-01-16T01:17:14+08:002018-01-16T01:17:14+08:00
    1. 这是一个扩展的正则表达式,所以使用-E
    2. 如果您使用带有特殊字符的搜索模式,请引用它们

    grep -E "^[a-z]{2}-[A-Z]{2}$"

    • 1

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve