我有这个功能,我在脚本中使用,在这个功能我从一个文件读取,在这个文件中我有空行,现在我想在这个文件上使用grep,但我不知道如果grep找不到想要的句子怎么办,这意味着我想比较一个空行:
我试过的: 我去了我当前目录中的文件,并逐行读取每个文件以删除多余的空格然后我在当前行使用grep,如果当前行中不存在“abcd”,则转到下一行之一。
function print_lines {
for file in *; do
while read f ; do
local line=`echo "$f"`
local x="`echo "$line" | grep -w "abcd"`"
if [[ "$x" != " " ]]; then
echo "i found "$x""
fi
done < "$file"
done
}
我知道我正在以错误的方式将$ x与空行进行比较!我怎么能这样做呢?
我也不能用sed,awk ......
答案 0 :(得分:2)
[[ "$x" != " " ]]
不与空行进行比较,而是与单个空格进行比较。您需要的是类似于[[ "$x" != "" ]]
的内容。
但是,bash
具有用于比较空字符串的特定测试:
[[ -z "${x}" ]]
你可以用以下方法测试:
pax> str="$(echo hello | grep e)" ; [[ -z "${str}" ]] && echo empty
pax> str="$(echo hello | grep z)" ; [[ -z "${str}" ]] && echo empty
empty
然而,这完全没有用,因为bash
能够搜索字符串中的简单事物,没有涉及grep
所有(a):
pax> str=hello ; [[ ${str/e/} != ${str} ]] && echo has an e
has an e
pax> str=hello ; [[ ${str/z/} != ${str} ]] && echo has an z
如果找到搜索字符串,${var/searchFor/replaceWith}
构造将修改字符串(在我们的示例中,删除匹配的文本)。因此,如果修改后的字符串与原始字符串不同,则表示它包含您要查找的内容。
(a)当你经常调用它时,这是特别很重要(就像在这里的行处理循环中一样)。流程启动和拆除不是免费的,因此,如果您可以避免它,您会发现通常可以提升性能。
答案 1 :(得分:1)
你需要的只是
$ if grep -wq "abcd" *; then echo "found"; fi
或
$ grep -wq "abcd" * && echo "found"