0

我需要检查一个文件是否包含一个确切的字符串,例如string12345,但不是string123456。这个字符串可以包含空格!该文件由所有需要检查的各行组成。

但是字符串可以在行上的不同位置,在分隔字符之间。分隔符可以是|,。最后,字符串也可以位于行的开头或结尾。

到目前为止我工作的每行检查是:

sLineFromFile=$(cat "${fFileToCheck}" | grep ^${sStringToCheck},)

因此,如果sLineFromFile不为空,我知道文件 ( fFileToCheck) 包含sStringToCheck,但仅在行首^且后跟逗号时,

我正在寻找这样的某种OR功能:

sLineFromFile=$(cat "${fFileToCheck}" | grep [^,|]${sStringToCheck}[,|$])

我认为这将基于此Unix & Linux SE 链接起作用,但它似乎将字符按字面意思书写(因此sLineFromFile始终为空)。我尝试了很多变化,包括:

sLineFromFile=$(cat "${fFileToCheck}" | grep @[^,|]${sStringToCheck},)
sLineFromFile=$(cat "${fFileToCheck}" | grep (^,|)${sStringToCheck},)
sLineFromFile=$(cat "${fFileToCheck}" | grep '[^,|]${sStringToCheck},')
sLineFromFile=$(cat "${fFileToCheck}" | grep [^,|]${sStringToCheck},)

(这里只是测试之前的字符sStringToCheck)。

我应该如何纠正这个?

4

1 回答 1

1

我看到两个选项:

  1. 如果stringToCheck仅包含单词字符(字母数字+下划线),您可以使用:

     grep -w "$stringToCheck" file
    
  2. 否则,请使用以下内容:

     grep -E "(^|[\|,])$stringToCheck([\|,]|$)" file
    

我认为这应该可以解决您的问题。

再次,而不是获得整个匹配的行,您可以使用类似的东西来实现相同的目标:

c=$(grep -Ec "(^|[\|,])$stringToCheck([\|,]|$)" file)
if [ $c -eq 0 ]
then
echo noMatch
else
echo hasMatch
fi
于 2013-08-28T12:39:07.417 回答