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
准备模式:
-将每个空格表示为POSIX字符类,以便在sed-zE的/[:space:]+/[:space:]*/g'
命令中进一步使用(多个空格被压缩为一个空格)grep
-将输入和输出数据视为行序列,每个行以零字节(ASCII NUL字符)而不是换行符终止-z
\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"]; ...