2017-08-14 20 views
0

我想匹配我的文件中以imports: [開頭且不包含SharedModule的字符串。它可以在兩個字符串之間有任何數字或空格,換行符或其他字符(單詞)。我一直試圖做找那些有:如何將兩個固定字符串之間的模式與無關字符/空格匹配?

grep 'imports: \[[.*\s*]*SharedModule' */*.module.ts 

,但我幾乎找不到具有「SharedModule」中的文件。我的思考過程是:*會找到任何單詞,並且會找到空格字符,而帶有*選擇器的字符類將允許以任何順序顯示。

  1. 我可以像這樣使用字符類來跳過可變數量的不相關的行/字符嗎?
  2. 如何否定語句以便返回沒有'SharedModule'的行?
  3. 目標是將「SharedModule」追加到導入數組,但不存在的地方。

謝謝! (我是新來的這一點,有一兩件事至今我學到的是:正則表達式是硬)

樣品不一致:

imports: [ 
    IonicPageModule.forChild(FormPage), 
    DynamicFormComponentModule, 
    SharedModule 
], 

不應該匹配,但

imports: [ 
    IonicPageModule.forChild(LeadershipPage), 
], 

應。

+2

'grep'默認情況下不會多,檢查https://開頭計算器。com/a/7167115/6320039 –

+0

正在使用選項-Zo現在,但只要我包含任何正則表達式,仍然沒有找到結果。 -P不被識別?我在Mac OS X 10.11.6 –

回答

1

grep默認情況下不處理多行字符串。這是gnu grep-z選項,但隨後正則表達式會更復雜一點。

你可能會更好使用gnu awk解決方案與定製RS(記錄分隔符):

awk -v RS='imports:[[:blank:]]*\\[[^]]*\\],[[:space:]]+' 'RT !~ /SharedModule/{ORS=RT} 1' file 

imports: [ 
    IonicPageModule.forChild(LeadershipPage), 
], 

哪裏file內容是這樣的:

cat file 
imports: [ 
    IonicPageModule.forChild(FormPage), 
    DynamicFormComponentModule, 
    SharedModule 
], 

imports: [ 
    IonicPageModule.forChild(LeadershipPage), 
], 
+0

偉大的工程!這似乎是返回整個文件,而不是隻想要的線。將管道結果通過sed命令添加'SharedModule'行工作? –

+0

只有GNU awk ... – dawg

+0

@ChrisSterbenz:你的awk版本是什麼?正如我在我的回答中提到的那樣,它需要'gnu awk' – anubhava

0

您可以通過在他們周圍使用一些編程邏輯來簡化正則表達式的要求。

這裏與POSIX awk

$ awk '/\[/ {f=1} 
     f{s=s $0 ORS} 
     /\]/{if (index(s, "SharedModule")==0) print s; f=0; s=""}' file 
imports: [ 
    IonicPageModule.forChild(LeadershipPage), 
], 

說明:

/\[/ {f=1}    # if [ in line, set a flag 
f{s=s $0 ORS}   # if that flag is set, copy the input to the string s 
/\]/     # closing ] in line 
         # print and reset 
{if ({if (index(s, "SharedModule")==0) print s; f=0; s=""}) print s; f=0; s=""} 

有了這個文件:

$ cat file 
imports: [ 
    IonicPageModule.forChild(FormPage), 
    DynamicFormComponentModule, 
    SharedModule 
], 

imports: [ 
    IonicPageModule.forChild(LeadershipPage), 
], 
相關問題