2017-08-07 41 views
0

我只想打印匹配的線和帶無與倫比的,但以下幾點:不打印無與倫比的文本與sed的

$ echo test12 test | sed -n 's/^.*12/**/p' 

我總是得到:

** test 

代替:

** 

我在做什麼錯?

[EDIT1]

我提供什麼,我需要更多的信息 - 實際上我應該開始使用它。所以,我有一個生成大量輸出行的命令,我只想抓取部分行 - 匹配的行,並且剝離結果。所以在上面的例子中,12是爲了找到該行的匹配部分的結尾,而不是**,我應該把&代表匹配的字符串。因此,完整的例子是:

echo test12 test | sed -n 's/^.*12/&/p' 

產生完全相同的輸出輸入:

test12 test 

預期的輸出結果是:

test12 

至於建議,我開始找到了grep的替代以下看起來很有希望:

$ echo test12 test | grep -Eo "^.*12" 

但我看不到如何格式化匹配的部分,這隻會剝離不匹配的文本。

+0

對於我來說不是很清楚你想要什麼,但也許是這樣的:'echo test12 test | sed -n's /^.* 12。*/**/p''。 – archemiro

+0

如果'echo'的輸出看起來不像您的輸入文件,請發佈您的輸入文件。 –

回答

2

編輯:在某些情況下,sed可能需要-E標誌。但是,括號不需要再逃脫了。檢查你的sed的手冊頁。

我想你正在尋找的是這樣的:

echo test12 test | sed -n 's/^\(.*12\).*$/\1/p' 
如果你要放棄行的其餘部分

,你必須與之相匹配的爲好,但不包括它的輸出。 \(\)表示一組然後由\1引用。

祝你好運:)

上sed的附加信息:上線 SED的作品,並通過符號表示是由給定的正則表達式匹配的整條生產線。如果正則表達式在結尾處是「打開」的(即,不以末尾字符結尾($),它就好像.*$被附加到匹配字符串。 (不知道它是如何實現的,但可能很好。)

+0

謝謝! - 我想補充說明\ 1需要-E開關 – mike

+0

真的嗎?有趣的是,它不適合我:)。很高興知道,讓我修改答案。 –

+0

我在macos和'$ echo test12 test | sed -n's /^(.* 12)。*/\ 1/p''給出:'sed:1:「s /^(.* 12)。*/\ 1/p」:\ 1未定義在RE' – mike

1

嘗試:

echo test12 test | sed -n 's/^.*/**/p' 

你並不需要匹配12號,因爲這是已經在您正則表達式來完成。

+1

對不起,我應該準備好了更好的問題 - 我想用這個命令來提取其他命令(多行)的結果的第一部分。最初sed看起來是這樣的:sed -n's /^.* 12 /&/ p',所以12找到匹配應該結束的一部分行,匹配部分用&輸出,但由於某些原因sed總是輸出所有無與倫比的部分 – mike

+0

@mike您是對的。請提供有效的輸入,編碼工作和期望的輸出。只需從命令行復制並粘貼即可。 –

+0

@JohnGoofy我已添加更多信息作爲編輯到我的問題 – mike

1

您的正則表達式匹配從行首到表達式'12'之間的任何內容。所有匹配的表達式都被替換爲'**',這就是爲什麼你得到'**測試'。如果你只想匹配我推薦你使用grep。