从KSH中三个字符之一的文件中获取一个精确的字符串

时间:2013-08-28 11:52:56

标签: regex ksh

我需要检查文件是否包含完整的字符串,例如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之前的角色。)

我该如何纠正?

1 个答案:

答案 0 :(得分:1)

我看到两个选项:

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

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

     grep -E "(^|[\|,])$stringToCheck([\|,]|$)" file
    
  3. 我认为这应该可以解决您的问题。

    再次使用以下内容,而不是获得整个匹配的行,

    c=$(grep -Ec "(^|[\|,])$stringToCheck([\|,]|$)" file)
    if [ $c -eq 0 ]
    then
    echo noMatch
    else
    echo hasMatch
    fi