提取两个单词之间的部分线

时间:2013-10-17 00:12:13

标签: sed line word

我想在一行中提取两个单词之间的所有单词

例如:1。word:p520-653DBBE 2.word:Server-9406-525-SN6582290

root@aixv71(/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:Server-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'

......但他们没有用。

感谢您的帮助。

穆拉特。

3 个答案:

答案 0 :(得分: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

可能会贪婪。

答案 1 :(得分:0)

您的第一种方法不起作用,因为使用,选择匹配模式之间并包括匹配模式的行,而不是行中的文本。

你的第三种方法几乎可以正常工作,但正则表达式必须匹配整行,以确保只打印替换文本而不是替换文本和行中原始文本的某些部分。

因此,以下脚本适用于我:

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

(编辑)

正如@potong指出的那样,如果字符串Server-9406-525-SN6582290在一行中出现多次,\(.*\)将匹配除Server-9406-525-SN6582290的最后一个实例以外的所有实例以及之前的所有内容最后一个例子,回到p520-653DBBE。 @potong建议的更复杂的方法处理这个“贪婪”的问题。

答案 2 :(得分: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.