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

时间:2012-03-16 11:18:58

标签: 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是一个保存文件名路径的变量。

如何获得所需的输出?

      3|Her   mi oh ne|is|silent

4 个答案:

答案 0 :(得分:7)

grep '[[:space:]]\{2,\}' ${dname}.txt >> ${dname}_error.txt

如果你想捕获2个或更多的空格。

答案 1 :(得分:4)

就是这样:

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

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

答案 2 :(得分:1)

以下是四种方式。

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

答案 3 :(得分:0)

如果您想要 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个空格,可以使用\s{2,4}