Vin*_*nay 8 sed string patterns
我有一个输入文件FILE1.TXT如下。
11 id1
12
13 AGE = 20
14 NAME = NAME1
15
16 id2
17
18 AGE = 30
19 NAME = NAME2
.
.
.
110 idXYZ
111
112 AGE = AGEXYZ
113 NAME = NAMEXYZ
114
115 idZZZ
116
Run Code Online (Sandbox Code Playgroud)
我想搜索属于特定Id 的所有字段并获取NAME的值
我设法遍历每个Id并根据需要为每个Id形成以下命令。
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'
这里的问题是,我得到了输出NAME1,除此之外,我还得到了NAMEXYZ。
应该改变什么,以便我只得到NAME1而不是NAMEXYZ?
作为解决方法,以下命令有效。
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'|head -1
是否有任何“开关”或我错过了什么?
使用单词边界:
grep '\bNAME1\b'
Run Code Online (Sandbox Code Playgroud)
会匹配NAME1
而不是NAME1XYZ
or XYZNAME1
。
相似地,
sed -n '/11\b/,/14\b/p'
Run Code Online (Sandbox Code Playgroud)
不会匹配包含111
和的行142
。
编辑:似乎输入文件中的数字实际上是行号。如果是这种情况,您可以简单地说:
sed '11,14!d'
Run Code Online (Sandbox Code Playgroud)
以获得所需的线条。
如果您知道要搜索的行号(如 Q 所示),请收紧正则表达式,以便不匹配不需要的行。
例如,更改:
sed -n '/11/,/14/p' | grep NAME | awk -F "= " '{print $2}'
Run Code Online (Sandbox Code Playgroud)
到
sed -n '/^11 /,/^14 /p' | grep NAME | awk -F "= " '{print $2}'
Run Code Online (Sandbox Code Playgroud)
将^
匹配行的开头和数字后的空格保证特定的行号将被匹配,并且您不会处理不需要的块。