1

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

例如: 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'

......但他们没有工作。

谢谢你的帮助。

穆拉特。

4

3 回答 3

1

这可能对您有用(GNU sed):

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

这会在预期字符串的两侧放置一个标记并提取字符串。

注意这会提取最短匹配

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

可能会陷入贪婪。

于 2013-10-17T08:02:02.467 回答
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.
于 2014-06-26T20:35:03.620 回答
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 建议的更复杂的方法可以解决这个“贪婪”问题。

于 2013-10-17T01:01:52.003 回答