有人能給我一個\ S在正則表達式工作的例子嗎?我的理解是,它應該與不\ t \ N開頭的任何行等 S正則表達式
如果這是我的文件:
test
\ttesting
cat testfile | awk '/\S/ {print}'
不產生輸出,但我期望它輸出\ t測試。我還沒有找到一個很好的例子,說明S應該做什麼或如何讓它起作用。
有人能給我一個\ S在正則表達式工作的例子嗎?我的理解是,它應該與不\ t \ N開頭的任何行等 S正則表達式
如果這是我的文件:
test
\ttesting
cat testfile | awk '/\S/ {print}'
不產生輸出,但我期望它輸出\ t測試。我還沒有找到一個很好的例子,說明S應該做什麼或如何讓它起作用。
我不認爲\S
標誌在awk
所有實現支持。它不在documentation的正則表達式運算符下列出。您的awk
版本可能支持也可能不支持。
的另一個簡單的命令行工具支持它是grep
。但是,出於您的目的,您需要指定您只想匹配字符串開頭的非空白字符,因此您需要使用^
運算符來開始字符串的開頭。
cat testfile | grep '^\S'
輸出:
testing
\S
當未指定UNICODE flags被,匹配任何非空白字符 ;這相當於set [^ \ t \ n \ r \ f \ v] LOCALE 標誌對非空白匹配沒有額外的影響。如果UNICODE被設置,則 然後任何字符未被標記爲空格的Unicode字符 屬性數據庫被匹配。
下面是示例:
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
它消除所有空行或而空間線(只有空間,標籤,o [R輸入等)
這裏是在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:]_].
書面,/\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:]]的縮寫。
\S is everything excluded by \s
\s means [\r\n\t\f ]
所以更好地觀看。如果你不希望打印出與\ t開頭的字符串,然後只用\S
字符串與任何\r\t\n\f
開始,你需要\s
所以不是\s
是\S
,所以你可以猜到它: \s + \S means everything
即相當於.*
它在gnu awk中有效。 – BMW
@寶馬,你能找到任何文件支持這一點,並提供一個版本號? – merlin2011
@寶馬,我剛剛修改了我的ansewr,因爲你的版本顯然必須支持它。 – merlin2011