Linux中检查字符串是否包含子字符串
1. 概述
使用 Linux 命令行时,一个常见的操作是检查一个字符串是否包含另一个子字符串。
在本教程中,我们将了解完成此任务的几种技术。首先,我们将回顾一些 shell 内置命令。然后,我们将探讨预装在 Linux 系统上的几种工具。
2. 使用 Shell 内置命令
shell 有几个工具可以帮助我们执行字符串评估。例如,Bash shell 具有*[ ]* 内置命令和 *[[ ]]*关键字。
这些工具可以执行字符串评估,我们可以使用这些评估在另一个字符串中搜索一个字符串。
假设我们想在*[[ ]]* 关键字和*=*运算符的帮助下,在字符串“pineapple”中找到子字符串“apple” :
$ [[ "pineapples" = *"apple"* ]] && echo "Found it :)"
Found it :)
在这里,我们指示 shell 将*=*运算符右侧的字符串视为一个模式。单词“apple”周围的特殊字符“ * ”将匹配任何字符串。
同样,我们可以使用*=~*运算符:
$ [[ "pineapples" =~ "apple" ]] && echo "Found it again :)"
Found it again :)
在这种情况下,我们指示* shell =~*运算符右侧的字符串将被视为 POSIX 扩展正则表达式。因此,此表达式将在左侧的单词中搜索匹配项。
接下来,让我们尝试使用内置命令*[ ]*,以避免 bashisms 并使其更便携:
$ [ -z "${pineapples##*apple*}" ] && echo "Found it again :)"
Found it again :)
在这种情况下,我们使用参数扩展 来删除与“apple”子字符串匹配的所有内容。如果匹配成功,则结果将为空,测试*[-z …]*的退出状态 将为真。
最后,我们可以使用case关键字:
$ case pineapples in
*apple*) echo "Found it :)";;
*) echo "Not Found";;
esac
Found it :)
在此示例中,我们对“pineapples”字符串执行模式匹配。如果匹配到字符串“apple”,则分隔符“ ;; ”之间的模式。”将被执行。
3. grep命令
grep 命令是一个很好的搜索工具。让我们尝试一个简单的模式匹配:
$ grep -q "apple" <<< "pineapples" && echo "Found it with grep"
Found it with grep
在这里,我们使用此处字符串 “«<”将“apple”输入grep。此外,我们可以使用管道来避免 bashism:
$ echo "pineapples" | grep -q "apple" && echo "Found it with grep"
Found it with grep
在这两种情况下,我们都使用了参数*-q*因为我们只需要退出状态。
4. sed命令
此外,我们可以使用sed 实用程序来匹配一个简单的正则表达式:
$ [ -n "$(sed -n '/apple/p' <<< 'pineapples')" ] && echo "Found it with sed"
Found it with sed
在这里,我们正在搜索包含单词“apple”的模式。如果sed找到它,那么它将用结果扩展命令替换 。
接下来,如果返回的字符串长度不为零,则内置*[ ]的-n*运算符将具有成功退出状态。
与grep场景类似,我们可以通过使用管道使其可移植来应用相同的策略:
$ [ -n "$( echo 'pineapples' | sed -n '/apple/p')" ] && echo "Found it with sed"
Found it with sed
5. awk命令
awk 是我们可以用来搜索子字符串的另一个强大工具。
让我们尝试一个简单的模式:
$ echo "pineapple" | awk '!/apple/{exit 1}' && echo Found
Found
在这里,我们只搜索字符串“apple”。然后,如果awk无法从字符串中找到它,我们将使用自定义状态错误强制退出。 此外,我们可以使用内部awk函数。让我们使用匹配功能 :
$ awk \
-v my_string="pineapples" \
-v my_substring="apple" ' \
BEGIN{ if (match(my_string, my_substring)) print "Found it with awk" }'
Found it with awk
在这里,我们分别将my_string 和 my_substring中的字符串和子字符串作为变量传递。
稍后,在 带有match函数的BEGIN 模式中,我们检查变量my_substring的内容是否在my_string变量中。
6. 使用 Perl 搜索
Perl 是另一个我们可以用来处理文本的非交互式强大工具。
我们可以用与awk场景类似的方式使用 Perl 解释器。换句话说,我们可以定义自定义变量来存储我们的字符串。
让我们尝试使用自定义参数名称后面的“- -”参数。让我们分别为字符串和子字符串调用它们*-my_str和-my_sub*:
$ perl -se 'print "Found it with Perl\n" if $my_str =~ /$my_sub/' -- -my_str=pineapple -my_sub=apple
Found it with Perl
在这里,在脚本内部,只有当变量my_str的内容与*=~*运算符右侧定义的正则表达式匹配时,Perl 才会打印消息。
我们能够实现这一点,因为允许创建变量的参数*-s*将它们定义为命令参数。