只是想知道是否有人可以指出我正确的方向。我想在一个文件中搜索2个字符串,如果匹配,则在csv文件中添加YES,否则添加NO。现在很难,我想让它找到字符串并在屏幕上打印SUCCESS,如果在下面找到的话(我宁愿尝试自己完成写入文件,以便我学习)。
我确实需要两个字符串匹配,否则结果应为No。
到目前为止我已经得到了这个:
#/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
答案 0 :(得分: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"
答案 1 :(得分:0)
您的代码处于良好的方向。您需要使用-e
更改-E
,以便grep
能够识别您正在使用的正则表达式($string1|$string2
)。您可能还希望避免看到实际的匹配(使用安静的-q
标志):
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的回答)
另一种解决方案是使用awk
:
awk '/'$string1'/{s1=1}/'$string2'/{s2=1} END { \
if (s1 && s2) print "IT WORKS!!!" ; else print "UH OH!!!" }' "$file"
答案 2 :(得分: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"
可行,但我确定会包含一些误报和/或漏报,具体取决于string1
和string2
的值。
答案 3 :(得分: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
版本那样安全,因为字符串中的正则表达式字符不是按字面意思处理而且效率很低,但它可以完成工作。