如何在数字后grep“a”和“aa”?

如何在数字后grep“a”和“aa”?

我的 .txt 文件包含如下行:

1a
1aa
2a
2aa

我想为“a”方执行一项特定任务,为“aa”方执行另一项特定任务。更准确和清楚地说,我为“a”方执行的任务不应适用于“aa”方,同样,我为“aa”方执行的任务不应适用于“a”方。

例如:

  • 对于“aa”一侧,我想转到一个目录
  • 对于“a”侧,我想要转到多个目录。

我怎样才能在我的脚本中做到这一点?

答案1

grep -xE '[0-9]+a'

xGreps 查找仅包含一个或多个十进制数字后跟 的行a

grep -xE '[0-9]+aa'

对于带有 的变体aa

-E是为了扩展正则表达式需要+.使用基本正则表达式和不使用-x,您可以执行以下操作:

grep '^[0-9]\{1,\}a$'

^$分别在行的开头和结尾匹配,并且\{1,\}是 ERE 的 BRE 等效项+(某些grep实现也支持\+这一点,并且您始终可以使用[0-9][0-9]*)。

答案2

由于正则表达式a也匹配“aa”,因此您应该在脚本中首先处理“aa”。

另一种选择是使用 perl 兼容的正则表达式 (PCRE),grep 有一个-P启用这些选项的选项,该选项确实带有警告

这是高度实验性的,grep -P可能会警告未实现的功能

(至少我拥有的版本,我不知道他们是否删除了该选项或更改/删除了新版本中的警告),或者您可以使用perl.那么类似的正则表达式/a(?!a)/应该可以在“a”的情况下使用。

答案3

#!/bin/sh

while read word; do
    case "$word" in
        *aa)    printf 'Got double "a": %s\n' "$word"   ;;
        *a)     printf 'Got single "a": %s\n' "$word"   ;;
        *)      printf 'Got weirdness:  %s\n' "$word"   ;;
    esac
done <file.in

使用以下示例数据运行此命令file.in

Got single "a": 1a
Got double "a": 1aa
Got single "a": 2a
Got double "a": 2aa

您可以通过围绕现有循环对文件进行循环来扩展它while

#!/bin/sh

for name in ./*.in; do
    while read word; do
        case "$word" in
            *aa)    printf 'Got double "a": %s\n' "$word"   ;;
            *a)     printf 'Got single "a": %s\n' "$word"   ;;
            *)      printf 'Got weirdness:  %s\n' "$word"   ;;
        esac
    done <"$name"
done

这是假设您输入的文件与模式匹配*.in并且位于当前目录中。

答案4

您可以将后缀aa与相匹配aa$。匹配后缀a有点困难,因为逻辑上也aa以以下结尾。a这就是为什么您需要[^a]a$匹配单个 a。这[^a]是一个倒置字符类,它是除 a 之外的所有字符。

相关内容