我试图使用shell脚本中的regex和BASH_REMATCH获取每个字符串的第一个字符。
我的输入文本文件包含:
config_text = STACK OVER FLOW
字符串堆栈 be FLOW必须是大写字母,如下所示。
我的输出应该是这样的:
SOF
我现在的代码是:
var = config_text
values=$(grep $var test_file.txt | tr -s ' ' '\n' | cut -c 1)
if [[ $values =~ [=(.*)]]; then
echo $values
fi
如您所见,我使用、tr、和裁剪了,但是我只想用替换它们,因为在许多链接中,这两个命令在MacOs上被报告为不起作用。
我试过这样的方法:
var = config_text
values=$(grep $var test_file.txt)
if [[ $values =~ [=(.*)(\b[a-zA-Z])]]; then
echo $values
fi
正如我所解释的,价值应该是:
S O F
但似乎\b不适用于shell脚本。任何人都知道如何只使用BASH_REMATCH获得我想要的输出。提前感谢您的帮助。
发布于 2022-11-10 15:55:36
一个通用的BASH_REMATCH解决方案,处理任意数量的单词和任何分隔符。
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"
发布于 2022-11-10 14:09:25
首先,放置一个有效的谢邦并将脚本粘贴到https://shellcheck.net进行验证/推荐。
假设直线以config
开头,以FLOW
结束。
config_text = STACK OVER FLOW
现在是剧本。
#!/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
循环。
#!/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]}"
Bashv4+
以来的MacOS,默认为Bashv3
发布于 2022-11-10 14:32:34
如果不知道输入字符串中有多少单词,那么Bash的regexes就有点麻烦了。这个怎么样?
config_text="STACK OVER FLOW"
sed 's/\([^[:space:]]\)[^[:space:]]*/\1/g' <<<"$config_text"
https://stackoverflow.com/questions/74389381
复制相似问题