如何在unix中查找字符串之间包含多个空格的行?

如何在unix中查找字符串之间包含多个空格的行?,unix,grep,Unix,Grep,我有这样的台词 1|Harry|says|hi 2|Ron|says|bye 3|Her mi oh ne|is|silent 4|The|above|sentence|is|weird 我需要一个grep命令来检测第三行 这就是我所做的 grep -E '" "" "+' $dname".txt" >> $dname"_error.txt" 我所依据的逻辑是,第一个空格后面必须有一个或多个空格才能被检测为错误 $dname是一个保存文件名路径的变量 如何获得所需的输出 (这

我有这样的台词

1|Harry|says|hi
2|Ron|says|bye
3|Her   mi oh ne|is|silent
4|The|above|sentence|is|weird
我需要一个grep命令来检测第三行

这就是我所做的

grep -E '" "" "+' $dname".txt" >> $dname"_error.txt"
我所依据的逻辑是,第一个空格后面必须有一个或多个空格才能被检测为错误

$dname是一个保存文件名路径的变量

如何获得所需的输出

(这是

      3|Her   mi oh ne|is|silent
)

仅此即可:

grep "  " ${dname}.txt >> ${dname}_error.txt

引用字符串中的两个空格可以正常工作。
-E
将模式转换为扩展正则表达式,这使得这里不必要的复杂化

grep '[[:space:]]\{2,\}' ${dname}.txt >> ${dname}_error.txt
如果要捕获2个或更多空格。

如果要捕获2个或更多空格,则:

grep -E "\s{2,}" ${dname}.txt >> ${dname}_error.txt
您的模式不起作用的原因是因为里面有引号
\s
用于[空格]。实际上,您可以对以下各项执行相同的操作:

grep -E '  +' ${dname}.txt >> ${dname}_error.txt

但是很难准确地说出你想要的版本是什么
\s\s+
也可以使用,但是
\s{2,}
是最简洁的,它还提供了设置上限的选项。如果要在一行中查找2、3或4个空格,可以使用以下四种方法

pearl.268> sed -n 's/  /&/p' ${dname}.txt >> ${dname}_error.txt
pearl.269> awk '$0~/  /{print $0}' ${dname}.txt >> ${dname}_error.txt
pearl.270> grep '  ' ${dname}.txt >> ${dname}_error.txt
pearl.271> perl -ne '/  / && print' ${dname}.txt >> ${dname}_error.txt

-E
将模式转换为扩展正则表达式,grep模式始终是正则表达式,除非给出了
-F
选项。这不是只捕获包含两个空格的行吗?如果是这样的话,我看不出它是如何回答这个问题的。@Prometheus任何一行如果有两个以上的连续空格,根据定义,都会有两个连续空格,所以这个命令也会找到它们。好的,我明白了。也许我把它误认为是一个固定的字符串。它们都已经过测试,并在grep(gnugrep)2.9上工作。您使用的是哪个版本?我想您可能需要重新检查“简明”的定义:-)