2

只是想知道是否有人可以指出我正确的方向。我想在一个文件中搜索 2 个字符串,如果它们匹配,则在 csv 文件中添加 YES,如果不匹配,则添加 NO。现在很难,我想让它找到字符串并在屏幕上打印 SUCCESS,如果找到如下所示(我宁愿尝试自己完成对文件的写入,以便我学习)。

我确实需要两个字符串都匹配,否则结果应该是否。

到目前为止,我已经得到了这个:

#/usr/bin/bash
file=test.xml
string1=TEST1
string2=TEST2
if grep -e "$string1|$string2" "$file"
then
    echo IT WORKS!!!
else
    echo UH OH!!!
fi
4

4 回答 4

1

使用grep您需要读取文件两次:

if grep "$string1" "$file" && grep "$string2" "$file"

但是,使用 AWK,您可以设置标志,并且您只需要读取文件一次:

awk -v s1="$string1" -v s2="$string2" '$0 ~ s1 {f1 = 1} $0 ~ s2 {f2 = 1} END {if (f1 && f2) {print "Yes"} else {print "No"}}' "$file"
于 2012-07-09T17:18:37.830 回答
0

假设任一字符串匹配就足够了,试试这个:

file=test.xml
string1="TEST1"
string2="TEST2"

if grep -q -F "$string1"$'\n'"$string2" "$file" ; then
    printf YES
else
    printf NO
fi

重要的是,-F这意味着如果字符串恰好包含正则表达式特殊字符,它们将被逐字处理。为方便起见-q,将抑制输出,grep因此您只会返回 YES/NO。

编辑:

由于您需要两个字符串都匹配,请尝试以下操作:

if [ $(sed -n -e "/${string1}/p;/${string2}/p" "$file" | wc -l) -ge 2 ] ; then
    printf YES
else
    printf NO
fi

这不像grep版本那样安全,因为字符串中的正则表达式字符没有按字面意思处理并且效率相当低,但它可以完成工作。

于 2012-07-09T16:07:59.200 回答
0

您的代码朝着好的方向发展。您需要更改-ewith-Egrep识别您正在使用的正则表达式 ( $string1|$string2)。您可能还希望避免看到实际匹配项(-q为此使用 quiet 标志):

file=test.xml
string1="TEST1"
string2="TEST2"
if grep -E -q "$string1|$string2" "$file"
then
    echo IT WORKS!!!
else
    echo UH OH!!!
fi

编辑:由于您需要匹配两个字符串,因此grep(AFAIK)除非您执行grep多次(如@chepner's answer),否则这是不可能的。

另一种解决方案是使用awk

awk '/'$string1'/{s1=1}/'$string2'/{s2=1} END { \
    if (s1 && s2) print "IT WORKS!!!" ; else print "UH OH!!!" }' "$file"
于 2012-07-09T16:02:20.230 回答
0

由于您希望两个字符串都匹配,因此一种低效的方法是grep为每个模式调用一次:

if grep -q "$string1" && grep -q "$string2"
then
echo IT WORKS
else
echo UH OH
fi

我不知道在没有相当复杂的正则表达式的情况下使用单个 grep 调用来做到这一点的方法。就像是

grep -qE "$string1.*$string2|$string2.*$string1"

可以工作,但我确信这将包括一些误报和/或误报,具体取决于 和 的string1string2

于 2012-07-09T16:04:13.100 回答