首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用BASH_REMATCH获取每个字符串的第一个字符

使用BASH_REMATCH获取每个字符串的第一个字符
EN

Stack Overflow用户
提问于 2022-11-10 12:58:19
回答 4查看 77关注 0票数 0

我试图使用shell脚本中的regex和BASH_REMATCH获取每个字符串的第一个字符。

我的输入文本文件包含:

代码语言:javascript
运行
复制
    config_text = STACK OVER FLOW

字符串堆栈 be FLOW必须是大写字母,如下所示。

我的输出应该是这样的:

代码语言:javascript
运行
复制
    SOF

我现在的代码是:

代码语言:javascript
运行
复制
        var = config_text
        values=$(grep $var test_file.txt | tr -s ' '  '\n' | cut -c 1)
        if [[ $values =~ [=(.*)]]; then
           echo $values
        fi

如您所见,我使用、tr、裁剪了,但是我只想用替换它们,因为在许多链接中,这两个命令在MacOs上被报告为不起作用。

我试过这样的方法:

代码语言:javascript
运行
复制
        var = config_text
        values=$(grep $var test_file.txt)
        if [[ $values =~ [=(.*)(\b[a-zA-Z])]]; then
           echo $values
        fi

正如我所解释的,价值应该是:

代码语言:javascript
运行
复制
    S O F

但似乎\b不适用于shell脚本。任何人都知道如何只使用BASH_REMATCH获得我想要的输出。提前感谢您的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-11-10 15:55:36

一个通用的BASH_REMATCH解决方案,处理任意数量的单词和任何分隔符。

代码语言:javascript
运行
复制
local input="STACK OVER FLOW" pattern='([[:upper:]]+)([^[:upper:]]*)' result=""
while [[ $input =~ $pattern ]]; do
    result+="${BASH_REMATCH[1]::1}${BASH_REMATCH[2]}"                 
    input="${input:${#BASH_REMATCH[0]}}"
done
echo "$result"
# Output: "S O F"
票数 1
EN

Stack Overflow用户

发布于 2022-11-10 14:09:25

首先,放置一个有效的谢邦并将脚本粘贴到https://shellcheck.net进行验证/推荐。

假设直线以config开头,以FLOW结束。

代码语言:javascript
运行
复制
config_text = STACK OVER FLOW

现在是剧本。

代码语言:javascript
运行
复制
#!/usr/bin/env bash

values="config_text = STACK OVER FLOW"
regexp="config_text = ([[:upper:]]{1})[^ ]+ ([[:upper:]]{1})[^ ]+ ([[:upper:]]{1}).+$"

while IFS= read -r line; do
  [[ "$line" = "$values" && "$values" =~ $regexp ]] &&
  printf '%s %s %s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
done < test_file.txt

如果只有一行,或者目标字符串/模式位于test_file.txt的第一行,则不需要while循环。

代码语言:javascript
运行
复制
#!/usr/bin/env bash

values="config_text = STACK OVER FLOW"
regexp="config_text = ([[:upper:]]{1})[^ ]+ ([[:upper:]]{1})[^ ]+ ([[:upper:]]{1}).+$"

IFS= read -r line < test_file.txt
[[ "$line" = "$values" && "$values" =~ $regexp ]] &&
printf '%s %s %s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
票数 1
EN

Stack Overflow用户

发布于 2022-11-10 14:32:34

如果不知道输入字符串中有多少单词,那么Bash的regexes就有点麻烦了。这个怎么样?

代码语言:javascript
运行
复制
config_text="STACK OVER FLOW"
sed 's/\([^[:space:]]\)[^[:space:]]*/\1/g' <<<"$config_text"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74389381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档