如何在文件中找到模式,其中模式和文件在单词之间具有不同的行数和空格?

时间:2017-05-31 11:24:49

标签: bash awk sed grep

我有一个存储字符串的变量。我在这里遇到了最坏的情况

 var='this is 
    my 
          name'

如何查找此变量是否存在于file.txt中

这是我的file.txt

hi all
    this 
           is my 
              name
    but no one likes it

我尝试了什么

if grep -Fwq "$var" file.txt 
    then
    echo "Duplicate"
    fi

但只有当var和file.txt都有公共空格和换行格式

时才能正常工作

2 个答案:

答案 0 :(得分:1)

sed + grep 方法:

tree.find('{0}Terminal/{0}Terminal.ConnectivityNode'.format(cim)).attrib['{0}resource'.format(rdf)]
echo "$var1"
this is 
    my 
          name

准备模式

cat file.txt
hi all
    this 
           is my 
              name
    but no one likes it
p=$(sed -zE 's/[[:space:]]+/[[:space:]]*/g' <<< "$var1")
  • if grep -wzq "$p" file.txt; then echo "Duplicate"; fi Duplicate - 将每个空格表示为POSIX字符类,以便在sed -zE 's/[[:space:]]+/[[:space:]]*/g'命令中进一步使用(多个空格被压缩为单个空格)

  • grep - 将输入和输出数据视为行序列,每行以零字节(ASCII NUL字符)而不是换行符结束

答案 1 :(得分:0)

使用GNU awk进行多字符RS(我也使用\s代替[[:space:]]以简化,因为我还在使用gawk):

$ awk -v RS="$var" 'BEGIN{gsub(/\s+/,"\\s+",RS)} END{if (NR>1) print "Duplicate"}' file
Duplicate

以上会在使用RS之前将var中的转义序列转换为文字字符(例如\t - >一个制表符,\n - >换行字符),如果是然后使用以下方法设置RS:

$ var="$var" awk 'BEGIN{RS=ENVIRON["var"]; ...

而不是使用-v设置。