有人能给我一个正则表达式中的\ S示例吗?我的理解是它应匹配任何不以\ t,\ n等开头的行
如果这是我的档案:
test
\ttesting
cat testfile | awk '/\S/ {print}'
不产生输出,但我希望它输出\ t测试。我还没有找到一个很好的例子,说明应该做什么或者如何让它发挥作用。
答案 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字符中没有标记为空格的任何字符 属性数据库匹配。
答案 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)
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
,即相当于.*