2013-10-17 37 views
1

我想提取兩個字之間的所有字線提取生產線的一部分單詞之間有兩個

例如:1.word:p520-653DBBE 2.word:服務器-9406-525-SN6582290

[email protected](/tmp/murat)$ cat test.txt 
p520-653DBBE hacmpn1 hacmpn2 NIMSERVER GPFSNODE2 GPFSNODE1 VIOS1 Server-9406-525-SN6582290  montofon TIVHOSTI_AIX TIVHOSTH_AIX TIVHOSTG_AIX TIVHOSTF_AIX TIVHOSTE_AIX TIVHOSTD TIVHOST8 TIVHOST7 TIVHOSTC TIVHOSTB TIVHOSTA TIVHOST6 TIVHOST9 65-82290 P520-653DBAE aixv71 VIOS2 hacmpnode2 hacmpnode1 VIOS1 Server-9406-520-SN10EA9CC test 

例如:如果我給1.word:p520-653DBBE 2.word:服務器-9406-525-SN6582290 我想看到的只有 「hacmpn1 hacmpn2 NIMSERVER GPFSNODE2 GPFSNODE1 VIOS1」

我想太多網上所述的方式

sed -n "/p520-653DBBE/,/Server-9406-525-SN6582290/p" 

sed -e '1,/p520-653DBBE/ s/#.*//' -e '/Server-9406-525-SN6582290/,$ s/#.*//' 

sed 's/p520-653DBBE\(.*\)Server-9406-525-SN6582290/\1/g' 

...但他們沒有工作。

謝謝你的幫助。

穆拉特。

回答

0

您的第一種方法不起作用,因爲使用,會選擇包含匹配模式的行,而不是行內的文本。

你的第三種方法幾乎可行,但正則表達式必須匹配整行,以確保只打印替換文本而不是替換文本和行中原始文本的一部分。

因此,下面的腳本爲我工作:

$ sed 's/^.*p520-653DBBE\(.*\)Server-9406-525-SN6582290.*$/\1/' <test.txt 
hacmpn1 hacmpn2 NIMSERVER GPFSNODE2 GPFSNODE1 VIOS1 

(EDIT)

正如@potong指出,如果字符串Server-9406-525-SN6582290多次出現在一行多,\(.*\)將匹配所有但Server-9406-525-SN6582290的最後一個實例以及最後一個實例之前的所有內容都返回到p520-653DBBE。 @potong建議的更復雜的方法處理這個「貪婪」問題。

1

這可能爲你工作(GNU SED):

sed -nr 's/p520-653DBBE/\n/;s/Server-9406-525-SN6582290/\n/;s/.*\n (.*) \n.*/\1/p' file 

這使標記預期字符串的兩側,並提取字符串。

N.B.這提取了最短的匹配

sed -nr 's/^.*p520-653DBBE(.*)Server-9406-525-SN6582290.*$/\1/p' file 

可能會陷入貪婪的犯規。

0

我會用grep

grep -Po '(?<=p520-653DBBE).*(?=Server-9406-525-SN6582290)' test.txt

備註grep -P

-P, --perl-regexp 
      Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features. 
在第3回答芯片
相關問題