我有一個問題,我需要在許多文件中識別每個問題的發生。該發生是基於跨多行的模式確定的。grep /正則表達式匹配整個多行的固定模式匹配的特殊條件
在我的情況下,我試圖識別具有前導空格,包含多於一個連續空格字符的文字,或者前面有一組已知小字(例如'或','和'等) 。文字由單引號決定。然而,我只對文字有興趣,其中前面四行包含單詞「LITERAL」。
下面是對文件的內容有一些例子:
EXEC LITERAL
LEVEL
NAME
LENGTH
VALUE (' Foo')
END EXEC
EXEC LITERAL
LEVEL
NAME
VALUE ('Foo Bar')
END EXEC
EXEC LITERAL
LEVEL
NAME
VALUE ('Bar Foo')
END EXEC
EXEC LITERAL
LEVEL
NAME
VALUE ('Foo')
END EXEC
EXEC LITERAL
LEVEL
NAME
LENGTH
VALUE ('or Bar')
END EXEC
EXEC DEFINITION
LEVEL
NAME
LENGTH
VALUE ('Bar')
END EXEC
在上面的例子中,我想輸出,以確定「富」的文件列表出現,「富酒吧」和「或酒吧'。請注意,'Bar Foo'不包含在內,因爲用於分隔引號內的單詞的任何空格是可接受的,如果它是單個空格的話。
我已經能夠構建grep語句,允許我識別多個空格,前導空格和包含一個小字(通過多個管道)的實例,但是我似乎無法使用grep for regex。我在另一篇文章中提到了使用pcregrep來支持grep中的正則表達式。我很樂意這樣做,但我有點用正則表達式丟失。
到目前爲止,我已經到了下面的命令:
pcregrep -M 'LITERAL.*\n.*\n.*\n.*\n.*VALUE.* ' test.txt
遺憾的是它不拾起「富酒吧」爲例(因爲4×\ n我相信)。接下來的一個拿起「富酒吧」,但並不拿起「或酒吧」:
pcregrep -M 'LITERAL.*\n.*\n.*\n.*\n.*VALUE.* ' test.txt
此外,當我用更大的數據測試集,將拿起LITERAL當它不符合上述模式(例如,它是與上述無關的另一個詞的一部分)。我真的需要表達式來限制給定模式的匹配,忽略不構成上述示例模式的VALUE或LITERAL實例。
如何解決此問題的任何幫助將是最受歡迎的。
釷幾乎在那裏,但它正在撿起'Foo'。如果在第一個單引號之後有空格的地方,或者對於與VALUE相同的行的單引號之間有兩個空格,可以修改它嗎?這樣它會忽略'Foo'並且會達到我想要實現的目標。 – Metalskin
@Metalskin,修訂後的版本檢查「VALUE」後面括號之間是否存在至少一個空格。並不像你需要的那樣具體,但正如你所看到的正則表達式正在失去控制...... – iruvar
非常接近!最後一個問題(這是我的錯,因爲它不在給出的例子中),如果我有「Foo Bar」,那麼它會被拾取。我需要排除在單引號之間出現單個空格而不是引號內的前導空格或尾部空格的單詞(如果有意義的話)。我會更新我的問題,以便更清楚。 啊,剛剛看到你說的地方並不像我需要的那麼具體。如果你沒有足夠的時間,我會試着用正則表達式來整理它。 – Metalskin