簡體   English   中英

sed 匹配變量多字

[英]sed match variable multiple words

使用此輸入:

int main(int argc, char *argv[])

我有一個 sed 腳本,它產生這個 output:

int main(argc, argv)
int argc; char *argv[];

行匹配表達式為:

/\w\s*\(((\w\s+[*]{0,1}\s*\w+\s*(\[\s*\]){0,1})\s*[,\)]\s*)+/ { block do stuff }

/\w\s*
但是,這與 function 構造不匹配:

int main(struct mystruct *astruct)

因為該類型現在由兩個單獨的單詞“struct mystruct”組成

所以我將比賽的初始部分更改為:

/\w\s*\((((\w\s+){1,2}[*]{0,1}\s*\w+\s*(\[\s*\]){0,1})\s*[,\)]\s*)+/

將第一個 '\w\s+' 更改為 '(\w\s+){1,2}'。

但這不匹配。 既不是 1 也不是兩個類型的詞。

不確定這里的解決方案是什么,或者為什么 '(\w\s+){1,2}' 不匹配后跟空格的一兩個單詞。

顯示問題的更簡單的表達式是:

/(\w\s+){1,2}/

這將匹配兩個單詞,后跟空格。

/(\w\s+){1,2}\)/

這將匹配兩個單詞,后跟一個 ' )' 並且有效。

但:

/\(\s*(\w\s+){1,2}/

我認為應該匹配'('后跟兩個單詞不起作用!

不知道我是如何誤解這一點的。

嘗試用 \ \w+替換\w ,因為\w只匹配一個字符。 它等價於 [a-zA-Z0-9_](除非使用非 ASCII unicode)。 要匹配具有多個字符的單詞,您必須使用\w+

您的正則表達式可以進行如下微調:

/\w+\s*\((((\w+\s+){1,2}\*?\s*\w+\s*(\[\s*\])?)\s*[,\)]\s*)+/

正則表達式演示

修改如下:

  1. \w替換為\w+
  2. {0,1}替換為? (更簡潔)
  3. [*]替換為\* (更簡潔)

無論如何,正則表達式可能仍需要進一步微調才能使用更通用的語法,例如使用空參數。 如果您只想匹配 2 個特定樣本,它現在應該可以正常工作了。

編輯

進一步微調以支持空參數以及超過 2 個參數(除了 1 或 2 個參數。因此,任意數量的參數)

/\w+\s*\(((\s*(\w+\s+){1,2}\*?\s*\w+\s*(\[\s*\])?)\s*)?(,(\s*(\w+\s+){1,2}\*?\s*\w+\s*(\[\s*\])?))*\)/

正則表達式演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM