这里使用的正则表达式是否符合 POSIX 标准,并且使用的代码是否适合所描述的问题?

2024-02-22

根据我之前的问题here https://stackoverflow.com/questions/76900817/check-whether-string-contains-emoji-in-posix-if-statement,请参阅下面我的问题的更完整形式。

代码用例

当前的代码是module https://github.com/polybar/polybar/wiki/User-contributed-modules用于polybar https://github.com/polybar/polybar,可定制的状态栏。根据第一个链接,使用配置文件和调用的每个条形图绘制多条形图(例如,通过运行polybar mybar)读取任何给定模块的配置文件。可以看到一个完整的例子here https://wiki.archlinux.org/title/Polybar#Sample_configuration。通过调用相关脚本文件来加载自定义或用户定义的模块。例如:

[module/test]
type = custom/script
exec = some/script/file
tail = true

Polybar 至少接受 shell 脚本和 python 脚本(也许还有其他脚本,尽管我还没有对此进行测试)。出于这个问题的目的,我关心我的 shell 脚本的适当性和not它与 Polybar 的接口(目前按预期工作;尽管如@EdMortonexplains https://stackoverflow.com/questions/76900817/check-whether-string-contains-emoji-in-posix-if-statement/76900818?noredirect=1#comment135568149_76900818,这可能不是预期的功能,因此这个问题)。

当前代码

以下是我的代码的最小工作示例。

#!/bin/bash

smile=#d1dadf;
sad=#ff5833;
angry=#1a88a4;
laugh=#daf7a6;

while true; do

    # get hour
    time=$(date +%_H -u);

    # set empty hour
    timeShow=TEST;

    # set empty emoji
    emoji=;

    if [ $time -ge 0 ] && [ $time -lt 6 ];
    then
            emoji=%{F$smile}????%{F-}
    elif [ $time -ge 6 ] && [ $time -lt 12 ];
    then
            emoji=%{F$sad}????%{F-}
    elif [ $time -ge 12 ] && [ $time -lt 18 ];
    then
            emoji=%{F$angry}????%{F-}
    elif [ $time -ge 18 ] && [ $time -ne 0 ];
    then
            emoji=%{F$laugh}????%{F-}
    fi

    if [[ "$emoji" =~ [????] ]];
    then
        ((timeShow = time - 1))
    elif [[ "$emoji" =~ [????] ]];
    then
        ((timeShow = time - 2))
    elif [[ "$emoji" =~ [????] ]];
    then
        ((timeShow = time - 3))
    fi

    echo "$timeShow:$(date '+%M' -u) $emoji"
    
    sleep 1
done

输入(和输出)的解释

按原样运行脚本不需要输入(输出是从脚本本身内部计算的)。因此,运行脚本只需通过以下方式完成:

./script.sh

输出应该(并且确实)返回格式化的时间,以及用颜色格式标签包裹的表情符号,如上所述。

目前的程序采用当前 UTC 时间date。该值(存储在变量time) 然后被修改并存储在timeShow。假设特定的时间范围(因此emoji),然后脚本修改timeShow通过减去 1、2 或 3。表情符号可在字符串中找到emoji通过执行正则表达式操作来定位由颜色格式包装的字符。

给定硬编码输入的预期输出

更改以下内容:

 while true; do... done

To this:

for time in 8 12 22 0; do... done

此外,应更改以下行以匹配以下内容:

# get hour
#time=$(date +%_H -u);

# set default hour
timeShow=0

假设脚本按小时运行,应给出以下预期输出。

循环 1(上午 8 点)(偏移量 -1):

7:00 %{F#ff5833}????%{F-}

循环 2(中午 12 点)(偏移量 -2):

10:00 %{F#1a88a4}????%{F-}

循环 3(晚上 10 点)(偏移量 -3):

19:00 %{F#daf7a6}????%{F-}

循环 4(上午 12 点)(偏移量为 0):

0:00 %{F#d1dadf}????%{F-}

所需输出

该脚本按预期工作。然而,如上所述,这可能并非偶然。此问题的目的是了解所使用的方法是否产生正确的输出,或者仅产生正确的输出happens这样做。正则表达式目前隔离了特点通过使用[????]。对于任何可能包含 2 个或更多字符的字形,M-bM-^XM-^A$例如,这样隔离表情符号,[????]可能不准确,因为它会匹配第一个对应的字符,从而导致不良或意外的行为。提供了对该问题的进一步解释here https://stackoverflow.com/questions/76900817/check-whether-string-contains-emoji-in-posix-if-statement/76900818#comment135568149_76900818.


而不是匹配$emoji使用正则表达式,在设置时设置另一个变量emoji,并在设置时使用它timeShow.

#!/bin/bash

smile=#d1dadf;
sad=#ff5833;
angry=#1a88a4;
laugh=#daf7a6;

while true; do

    # get hour
    time=$(date +%_H -u);

    # set empty hour
    timeShow=TEST;
    timeOffset=0

    # set empty emoji
    emoji=;

    if [ $time -ge 0 ] && [ $time -lt 6 ];
    then
            emoji=%{F$smile}????%{F-}
            timeOffset=3
    elif [ $time -ge 6 ] && [ $time -lt 12 ];
    then
            emoji=%{F$sad}????%{F-}
            timeOffset=1
    elif [ $time -ge 12 ] && [ $time -lt 18 ];
    then
            emoji=%{F$angry}????%{F-}
            timeOffset=2
    elif [ $time -ge 18 ] && [ $time -ne 0 ];
    then
            emoji=%{F$laugh}????%{F-}
            timeOffset=3
    fi

    timeshow=$((time - timeOffset)

    echo "$timeShow:$(date '+%M' -u) $emoji"
    
    sleep 1 &
    wait
done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这里使用的正则表达式是否符合 POSIX 标准,并且使用的代码是否适合所描述的问题? 的相关文章

  • 为什么我不能将 sed 的输出重定向到文件

    我正在尝试运行以下命令 someprogram tee dev tty sed s 2 gt output file 但当我去查看时 该文件始终是空白的 如果我删除 gt output file从命令末尾 我可以看到 sed 的输出 没有任
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • 如何使用 PHP 从内容中查找 URL?

    需要一个简单的 preg match 它将在内容中查找 c aspx 不带引号 如果找到 它将返回整个 url 举个例子 content div 4 a href m c aspx mt 01 9310ba801f1255e02e411d8
  • 你能挽救我的负面回顾示例来传达数字吗?

    在 高级正则表达式 一章中掌握 Perl http oreilly com catalog 9780596527242 我有一个损坏的示例 我无法找到一个很好的修复方法 这个例子可能为了自己的利益而试图变得太聪明 但也许有人可以帮我解决它
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • PHP URL 验证

    我知道有无数的线程问这个问题 但我一直无法找到一个可以帮助我解决这个问题的线程 我基本上试图解析大约 10 000 000 个 URL 的列表 确保它们根据以下标准有效 然后获取根域 URL 此列表包含您能想象到的几乎所有内容 包括类似的内
  • 使用带有curl 的内部字段分隔符

    当我做 ls IFS l 我得到了我期望的输出 当我做 curl IFShttp www google com 我不 我是否误解了内部字段分隔符 如何在不使用任何空格字符的情况下运行curl 命令 您需要将变量放在大括号内 否则 shell
  • Slim 3 - 斜杠作为路由参数的一部分

    我需要使用可以包含斜杠 的参数来编写 URL 例如 经典的 hello username 路线 默认情况下 hello Fabien将匹配此路线 但不匹配 hello Fabien Kris 我想问你如何在 Slim 3 框架中做到这一点
  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • Grep 和 Python

    我需要一种通过 Unix 命令行中的正则表达式使用 grep 搜索文件的方法 例如 当我在命令行中输入 python pythonfile py RE file to be searched 我需要正则表达式 RE 在文件中搜索并打印出匹配
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • bash 中 :-(冒号破折号)的用法

    bash中这种风格的含义是什么 PUBLIC INTERFACE eth0 目的是什么 If PUBLIC INTERFACE存在且不为null 则返回其值 否则返回 eth0 实际上有一些记录在bash 手册页 http linux di
  • git 匹配多个单词的标签

    我们可以得到最后一个 git 标签 它以一个单词 例如 TEST 开头 如下所示 git describe tag dirty match TEST 我想知道如何获得最后一个以 word1 开头的标签orword2 例如测试OR跑步 我尝试
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • 从正则表达式对象中提取允许字符串的最大长度

    一旦加载到 C 中 是否可以从正则表达式模式中提取允许的字符串的最大长度Regex object 如果我有一个正则表达式字符串定义为 A Z0 9 0 20 我可以使用字符串操作来获取最大允许长度20 但是 有没有一种方法可以更轻松地实现这
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da

随机推荐