我想在一行中提取两个单词之间的所有单词
例如: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'
......但他们没有用。
感谢您的帮助。
穆拉特。
答案 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.