我想要在文件中的行中「測試」單詞之後的單詞。意味着在真正意義上,我不想在「測試」一詞之前出現的單詞。如何刪除一行到特定字符模式的字...正則表達式
這就是該圖案...
e.g:
輸入:
***This is a*** test page.
***My*** test work of test is complete.
輸出:
test page.
work of test is complete.
我想要在文件中的行中「測試」單詞之後的單詞。意味着在真正意義上,我不想在「測試」一詞之前出現的單詞。如何刪除一行到特定字符模式的字...正則表達式
這就是該圖案...
e.g:
輸入:
***This is a*** test page.
***My*** test work of test is complete.
輸出:
test page.
work of test is complete.
使用SED:
sed -n 's/^.*test/test/p' input
如果要打印不匹配的行,不變:
sed 's/^.*test/test/' input
的一個以上將刪除(貪婪)的所有文字直到最後的test
就行。如果你想刪除到第一次測試使用波東的建議:
sed -n 's/test/&\n/;s/.*\n//p' input
謝謝...它的作品!其實我的嘗試是:sed's /^.\+ test \/test/g'....但它不起作用 –
您能解釋何時使用'。*'以及何時使用'。\ +'?我是新手在正則表達式...提前感謝。我很欣賞,如果你給我真正有用的鏈接正則表達式tutorail ... –
與sed,最好避免'+'完全。但是如果你必須的話,如果你確實需要'test'之前的東西,那就使用它。使用'^。\ + test',你不能匹配'test is over',因爲點必須至少匹配一個字符和'+'。 – perreal
純bash單行:
while read x; do [[ $x =~ test.* ]] && echo ${BASH_REMATCH[0]}; done <infile
輸入:infile中
This is a test page.
My test work of test is complete.
輸出:
test page.
test work of test is complete.
它讀取來自文件infile
所有行,檢查行包含字符串test
然後打印該行的其餘部分(包括test
)。
同樣在sed:
SED的/。 (test。)/ \ 1 /'infile(糟糕!這是錯誤的!.*
是貪婪的,所以它從第二行示例中切割得太多)。這種運作良好:
sed -e 's/\(test.*\)/\x03&/' -e 's/.*\x03//' infile
我做了一些高速測試(原來爲(錯誤)sed版)。結果是對於小文件,bash解決方案表現更好。對於較大的文件sed更好。我也試過這個awk版本,這是即使在大文件更好:
在 perlawk 'match($0,"test.*"){print substr($0,RSTART)}' infile
類似:
perl -ne 's/(.*?)(test.*)/$2/ and print' infile
我用了兩行例子輸入文件,我每次都重複它。每個版本運行1000次。其結果是:
Size | bash | sed | awk | perl
[B] | [sec] | [sec] | [sec] | [sec]
------------------------------------------
55 | 0.420 | 10.510 | 10.900 | 17.911
110 | 0.460 | 10.491 | 10.761 | 17.901
220 | 0.800 | 10.451 | 10.730 | 17.901
440 | 1.780 | 10.511 | 10.741 | 17.871
880 | 4.030 | 10.671 | 10.771 | 17.951
1760 | 8.600 | 10.901 | 10.840 | 18.011
3520 | 17.691 | 11.460 | 10.991 | 18.181
7040 | 36.042 | 12.401 | 11.300 | 18.491
14080 | 72.355 | 14.461 | 11.861 | 19.161
28160 |145.950 | 18.621 | 12.981 | 20.451
56320 | | | 15.132 | 23.022
112640 | | | 19.763 | 28.402
225280 | | | 29.113 | 39.203
450560 | | | 47.634 | 60.652
901120 | | | 85.047 |103.997
@ user1640065:有一點不明確。如果該行不包含「測試」一詞,應該怎麼做。它現在不打印任何東西。 – TrueY
在我的情況下,每個輸入行都必須包含「測試」。 (Actuaaly我解析日誌文件,並在特定的模式上工作在我的情況下,「測試」實際上是「異常」字 –
但我希望這與sed命令的幫助 –
我不知道我明白那裏的模式是什麼。你能澄清一下嗎? – Jerry
模式是:任何「測試」字前。 –