【问题标题】:Get first character of each string with BASH_REMATCH使用 BASH_REMATCH 获取每个字符串的第一个字符
【发布时间】:2022-11-11 21:11:46
【问题描述】:

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

我的输入文本文件包含:

    config_text = STACK OVER FLOW

弦乐 超过 流动必须是这样的大写。

我的输出应该是这样的:

    SOF

我现在的代码是:

        var = config_text
        values=$(grep $var test_file.txt | tr -s ' '  '\n' | cut -c 1)
        if [[ $values =~ [=(.*)]]; then
           echo $values
        fi

如您所见,我正在使用tr但我只想替换它们BASH_REMATCH因为这两个命令已在许多链接中报告为在 MacO 上不起作用。

我试过这样的事情:

        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只要。 提前感谢您的帮助。

【问题讨论】:

  • 如果您必须使用 regex 和 BASH_REMATCH,也许可以尝试 this 一次提取一个字符串,但是对于所有需要的努力来说,将行拆分为数组并在 = 之后迭代所有内容不仅更容易?
  • 如果您有var='config_text = STACK OVER FLOW',那么您可以使用read -ra myarray <<< "$var" 创建一个数组,然后您将拥有数组元素2+ 中的所有单词,以便根据需要进行迭代和处理。

标签: bash shell scripting


【解决方案1】:

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


现在是脚本。

#!/usr/bin/env bash

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

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

  • 确保您拥有并运行/使用 Bashv4+,因为 MacOS,默认为 Bashv3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2015-01-17
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2012-11-10
    相关资源
    最近更新 更多