如何在bash中将一行与空行进行比较?

时间:2017-11-10 02:04:33

标签: bash

我有这个功能,我在脚本中使用,在这个功能我从一个文件读取,在这个文件中我有空行,现在我想在这个文件上使用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 ......

2 个答案:

答案 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"