我試過'/pat1/,/pat2/p'
,但我只想打印模式之間的文本,而不是整行。我怎麼做?在正則表達式之間打印文本
回答
的圖案的範圍是用於多線圖案的圖案。這是你會怎麼做:
sed -n '/pat1/,/pat2/{/pat1\|pat2/!p}' inputfile
-n
- 不要默認/pat1/,/pat2/
打印 - 兩種模式包容/pat1\|pat2/!p
內 - 打印的一切,這不是模式 之一
您可能要求的是同一行上的兩種模式之間的內容。其他答案之一會做到這一點。
編輯:
幾個例子:
$ cat file1
aaaa bbbb cccc
123 start 456
this is what
I want
789 end 000
xxxx yyyy zzzz
$ sed -n '/start/,/end/{/start\|end/!p}' file1
this is what
I want
,你可以告訴sed
縮短其再次使用最新的模式(//
):
$ sed -n '/.*start.*/,/^[0-9]\{3\} end 0*$/{//!p}' file1
this is what
I want
由於你可以看到,我不必在命令的第二部分中複製冗長而複雜的正則表達式。
我不知道你使用的模式的種類,但我認爲它也可以用正則表達式。
cat myfile | sed -r 's/^(.*)pat1(.*)pat2(.*)$/\2/g'
貓的無用用途。 – ghostdog74 2010-07-11 23:52:41
沒有必要捕捉第一個和最後一個組。 – 2010-07-12 00:10:33
你可以使用awk。
$ cat file
other TEXT
pat1 text i want pat2
pat1 TEXT I
WANT
pat2
other text
$ awk -vRS="pat2" 'RT{gsub(/.*pat1/,"");print}' file
text i want
TEXT I
WANT
的解決方案適用於跨越多行的
sed -r 's/pat1(.*)pat2/\1/g' somefile.txt
您需要轉義括號或使用'-r'選項。 – 2010-07-12 00:11:54
謝謝,編輯。 – Johnsyweb 2010-07-12 01:35:52
- 1. 正則表達式之間的選擇性打印
- 2. 使用正則表達式在文本之間獲取文本
- 3. 打印正則表達式在bash
- 4. vb.net正則表達式 - 捕獲文本之間的文本
- 5. 打印匹配正則表達式
- 6. Sed和正則表達式僅打印
- 7. SED打印行正則表達式
- 8. 正則表達式無法打印
- 9. Java的正則表達式打印字
- 10. 打印Perl正則表達式匹配
- 11. 非打印正則表達式
- 12. 正則表達式程序不打印
- 13. Python正則表達式在頭之間找到特定文本
- 14. Python-正則表達式 - 在多行文本之間過濾
- 15. PHP正則表達式 - 在斜槓之間獲取文本
- 16. 正則表達式在大括號之間獲取文本
- 17. Ruby正則表達式:在引號之間提取文本
- 18. 正則表達式在標籤之間獲取文本
- 19. 在括號之間返回文本的正則表達式
- 20. 正則表達式來修改文本在標籤AS3之間
- 21. 使用正則表達式在引號之間獲取文本
- 22. 正則表達式在標籤之間獲取文本
- 23. 在兩個正則表達式之間查找文本
- 24. 正則表達式「間」文本
- 25. 避免在正則表達式中打印空間
- 26. 正則表達式不在PHP中的括號之間打印字符串
- 27. 正則表達式:文本
- 28. Perl正則表達式 - 打印匹配的條件正則表達式
- 29. 使用正則表達式刪除括號之間的文本
- 30. 正則表達式來刪除文本之間//
嗯,這是否工作?我認爲它更適合替代'pat [12]'而不是使用'!p'。當然,如果我不誤解OP的要求。 :) – ghostdog74 2010-07-12 01:57:34
@ ghostdog74:我認爲OP使用了錯誤的形式(我在答案中有一個)做他想做的事。我最後一段談到了這一點。你的回答解決了兩種形式。我會添加一個或兩個例子。 – 2010-07-12 02:46:00
感謝您的編輯。什麼時候開始和結束模式恰好在同一行?例如'開始這是我想結束的文本'。雖然OP沒有顯示他的文件樣本,但我猜他可能在同一行上有兩種模式。 – ghostdog74 2010-07-12 04:12:22