我需要检查文件是否包含完整的字符串,例如string12345
,而不是string123456
。这个字符串可以包含空格!该文件包含所有需要检查的行。
但是字符串可以位于行的不同位置,在分隔字符之间。划分字符可以是|
或,
。最后,字符串也可以位于行的开头或结尾。
我到目前为止每行检查的是:
sLineFromFile=$(cat "${fFileToCheck}" | grep ^${sStringToCheck},)
因此,如果sLineFromFile
不为空,我知道文件(fFileToCheck
)包含sStringToCheck
,但只在行^
的开头,后面跟着逗号,
。
我正在寻找某种OR
这样的功能:
sLineFromFile=$(cat "${fFileToCheck}" | grep [^,|]${sStringToCheck}[,|$])
我认为这可以基于此Unix & Linux SE link工作,但它似乎将字符字面上写为(因此sLineFromFile
始终为空)。我尝试了很多变化,包括:
sLineFromFile=$(cat "${fFileToCheck}" | grep @[^,|]${sStringToCheck},)
sLineFromFile=$(cat "${fFileToCheck}" | grep (^,|)${sStringToCheck},)
sLineFromFile=$(cat "${fFileToCheck}" | grep '[^,|]${sStringToCheck},')
sLineFromFile=$(cat "${fFileToCheck}" | grep [^,|]${sStringToCheck},)
(这里只是测试sStringToCheck
之前的角色。)
我该如何纠正?
答案 0 :(得分:1)
我看到两个选项:
如果 stringToCheck 只包含单词字符(字母数字+下划线),您可以使用:
grep -w "$stringToCheck" file
否则,请使用以下内容:
grep -E "(^|[\|,])$stringToCheck([\|,]|$)" file
我认为这应该可以解决您的问题。
再次使用以下内容,而不是获得整个匹配的行,
c=$(grep -Ec "(^|[\|,])$stringToCheck([\|,]|$)" file)
if [ $c -eq 0 ]
then
echo noMatch
else
echo hasMatch
fi