gpt4 book ai didi

regex - bash if 语句中的模式匹配

转载 作者:行者123 更新时间:2023-12-02 20:42:12 24 4
gpt4 key购买 nike

我正在尝试计算目录中所有 .txt 文件中至少有两个元音的单词。到目前为止,这是我的代码:

#!/bin/bash

wordcount=0


for i in $HOME/*.txt
do
cat $i |
while read line
do
for w in $line
do
if [[ $w == .*[aeiouAEIOU].*[AEIOUaeiou].* ]]
then
wordcount=`expr $wordcount + 1`
echo $w ':' $wordcount
else
echo "In else"
fi
done
done
echo $i ':' $wordcount
wordcount=0
done

这是我从 txt 文件中提取的示例

Last modified: Sun Aug 20 18:18:27 IST 2017
To remove PPAs
sudo apt-get install ppa-purge
sudo ppa-purge ppa:

问题是它与文本文件中所有单词的 if 语句中的模式不匹配。它直接转到 else 语句。其次,echo $i ':' $wordcount 中的 wordcount 等于 0,这应该是某个值。

最佳答案

近期问题:Glob 与 Regex

[[ $string = $pattern ]] 不执行正则表达式匹配;相反,它是一个 glob 风格的模式匹配。虽然 . 在正则表达式中表示“任何字符”,但它在 glob 中仅匹配自身。

这里有几个选项:

  1. 使用=~代替执行正则表达式匹配:

    [[ $w =~ .*[aeiouAEIOU].*[AEIOUaeiou].* ]]
  2. 使用 glob 风格的表达式而不是正则表达式:

    [[ $w = *[aeiouAEIOU]*[aeiouAEIOU]* ]]

    注意这里使用的是=而不是==;虽然两者在技术上都是有效的,但前者避免了构建手指内存,这会在为 test/[ 的 POSIX 实现编写代码时导致错误,如 = is the only valid string comparison operator那里。


更大的问题:正确逐字阅读

使用 for w in $line 本质上是不安全的。使用 read -a 将一行读入单词数组:

#!/usr/bin/env bash

wordcount=0
for i in "$HOME"/*.txt; do
while read -r -a words; do
for word in "${words[@]}"; do
if [[ $word = *[aeiouAEIOU]*[aeiouAEIOU]* ]]; then
(( ++wordcount ))
fi
done
done <"$i"
printf '%s: %s\n' "$i" "$wordcount"
wordcount=0
done

关于regex - bash if 语句中的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com