如何使用`sed`匹配精确的字符串?但不是它的一部分。?

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

是否有任何“开关”或我错过了什么?

dev*_*ull 6

使用单词边界:

grep '\bNAME1\b'
Run Code Online (Sandbox Code Playgroud)

会匹配NAME1而不是NAME1XYZor 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)

以获得所需的线条。


cas*_*sey 3

如果您知道要搜索的行号(如 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)

^匹配行的开头和数字后的空格保证特定的行号将被匹配,并且您不会处理不需要的块。