我的 .txt 文件包含如下行:
1a
1aa
2a
2aa
我想为“a”方执行一项特定任务,为“aa”方执行另一项特定任务。更准确和清楚地说,我为“a”方执行的任务不应适用于“aa”方,同样,我为“aa”方执行的任务不应适用于“a”方。
例如:
- 对于“aa”一侧,我想转到一个目录
- 对于“a”侧,我想要转到多个目录。
我怎样才能在我的脚本中做到这一点?
答案1
grep -xE '[0-9]+a'
x
Greps 查找仅包含一个或多个十进制数字后跟 的行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 之外的所有字符。