\ S正则表达式

时间:2014-04-14 06:13:59

标签: regex awk

有人能给我一个正则表达式中的\ S示例吗?我的理解是它应匹配任何不以\ t,\ n等开头的行

如果这是我的档案:

test
\ttesting

cat testfile | awk '/\S/ {print}'

不产生输出,但我希望它输出\ t测试。我还没有找到一个很好的例子,说明应该做什么或者如何让它发挥作用。

5 个答案:

答案 0 :(得分:1)

如上所述,如果行中的任何位置存在非空白字符,则/\S/匹配。因此它匹配两条线。听起来你想在行的开头匹配:

$ cat testfile | awk '/^\S/ {print}'
test
$ cat testfile | awk '/^\s/ {print}'
        testing

插入符号^仅匹配行的开头。从上面的第一个示例中,/^\S/匹配在行开头之后的第一个字符是非空白字符的任何行。因此,它匹配测试文件中的第一行。

第二个示例正好相反:如果行开头后的第一个字符是空白字符(\s\S相反:它匹配空格),则匹配。因此,它匹配以制表符开头的行。

\S\s的行为记录在section 3.5 of the GNU awk manual中,其中指出:

  

\ S
      匹配任何空白字符。把它想象成[[:space:]]的简写。

     

\ S
      匹配任何不是空格的字符。可以把它想象为[^ [:space:]]的简写。

答案 1 :(得分:0)

\S
  

如果未指定UNICODE标志,则匹配任何非空格   字符;这相当于集合[^ \ t \ n \ r \ n \ f \ v] LOCALE   flag对非空白匹配没有额外影响。如果设置了UNICODE,   然后在Unicode字符中没有标记为空格的任何字符   属性数据库匹配。

https://docs.python.org/2/library/re.html

答案 2 :(得分:0)

我认为\S的所有实现都不支持awk标志。它未列在documentation中的正则表达式运算符下。您的awk版本可能支持也可能不支持。

另一个 支持它的简单命令行工具是grep。但是,出于您的目的,您需要指定您只想在字符串的开头匹配非空格,因此您需要使用^运算符来执行字符串的开头。

cat testfile | grep  '^\S' 

输出:

testing

答案 3 :(得分:0)

以下是样本:

cat -A file

sdf$
        $
test$
^Itesting$
$
$
^I^I^I^I$
asdf$
afd afd$

所以在gnu awk v4.1中运行后

awk '/\S/' file

sdf
test
        testing
asdf
afd afd

删除所有空行或空格行(仅包含空格,制表符或输入等)

这是我在cygwin中的awk版本

awk --version |head -1
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.2, GNU MP 4.3.2)

参考链接:The GNU Awk User's Guide

3.5 gawk-Specific Regexp Operators

GNU software that deals with regular expressions provides a number of additional regexp operators. These operators are described in this section and are specific to gawk; they are not available in other awk implementations. Most of the additional operators deal with word matching. For our purposes, a word is a sequence of one or more letters, digits, or underscores (‘_’):

\s
Matches any whitespace character. Think of it as shorthand for [[:space:]].


\S
Matches any character that is not whitespace. Think of it as shorthand for [^[:space:]].


\w
Matches any word-constituent character—that is, it matches any letter, digit, or underscore. Think of it as shorthand for [[:alnum:]_].


\W
Matches any character that is not word-constituent. Think of it as shorthand for [^[:alnum:]_].

答案 4 :(得分:0)

\S is everything excluded by \s

\s means [\r\n\t\f ]所以最好小心。如果您不想打印以\ t开头的字符串,则只使用\S

对于以任何\r\t\n\f开头的字符串,您需要\s

所以NOT \s\S

所以你可以猜到:\s + \S means everything,即相当于.*