Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在模式和文件都有不同行数和单词间距的文件中找到模式?_Bash_Awk_Sed_Grep - Fatal编程技术网

Bash 如何在模式和文件都有不同行数和单词间距的文件中找到模式?

Bash 如何在模式和文件都有不同行数和单词间距的文件中找到模式?,bash,awk,sed,grep,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='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都有公共空间和换行格式时,这种方法才有效

echo "$var1"
this is 
    my 
          name


准备模式:


  • sed-zE的/[:space:]+/[:space:]*/g'
    -将每个空格表示为POSIX字符类,以便在
    grep
    命令中进一步使用(多个空格被压缩为一个空格)

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


使用GNU awk进行多字符RS(我也使用了
\s
而不是
[[:space:]]
,因为我使用的是gawk):

上述操作将在使用RS之前将
var
中的转义序列转换为文字字符(例如
\t
->制表符,
\n
->换行符),如果不需要,则使用以下方法设置RS:

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

不要使用
-v

将变量和输入文件的所有空白(空格、制表符、换行符等)转换为单个空格,然后进行比较?文件很大可以删除空格,但不能删除所有换行符possible@j.doe你什么意思?为什么你认为删除空白比删除换行符花费更少?这只匹配
name
@RomanPerekhrest不确定你为什么只回复我,但我已经读过了问题,他们想匹配
var
中的整个字符串,这匹配单行
name
,从文件中删除
这是我的
,它仍将与.YMMV匹配,假设输入不包含NUL字符。它们存在于文本文件中,这就是为什么
awk-vrs='\0'
不被认为是一种一次读取整个文件的健壮方法,而是使用
awk-vrs='^$'
。你可以做
sed的/@/@A/g;在运行grep来解决问题之前,在输入文件和变量上设置s/\0/@B/g'
或类似设置。@RomanPerekhrest这工作得很好。但是,如果列表中存在asterix(*),则它将失败var@RomanPerekhrest对不起,这只是一个例子。Var和file都可以有asterix。
p=$(sed -zE 's/[[:space:]]+/[[:space:]]*/g' <<< "$var1")
if grep -wzq "$p" file.txt; then echo "Duplicate"; fi
Duplicate
$ awk -v RS="$var" 'BEGIN{gsub(/\s+/,"\\s+",RS)} END{if (NR>1) print "Duplicate"}' file
Duplicate
$ var="$var" awk 'BEGIN{RS=ENVIRON["var"]; ...