sed-使用两个字符串寻址

时间:2018-09-09 23:18:58

标签: sed

我正在接sed。当使用模式指定行地址时,我无法理解sed中的行寻址如何工作。

我有一个名为emp.lst的示例文本文件,其内容如下:

2233|a.k. shukla      |g.m.     |sales     |12/12/52|6000
9876|jai sharma       |director |production|12/03/50|7000
5678|sumit chakrobarty|d.g.m.   |marketing |19/04/43|6000
2365|barun sengupta   |director |personnel |11/05/47|7800
5423|n.k. gupta       |chairman |admin     |30/08/56|5400
1006|chanchal singhvi |director |sales     |03/09/38|6700
6213|karuna ganguly   |g.m.     |accounts  |05/06/62|6300
1265|s.n. dasgupta    |manager  |sales     |12/09/63|5600
4290|jayant Choudhury |executive|production|07/09/50|6000
2476|anil aggarwal    |manager  |sales     |01/05/59|5000
6521|lalit chowdury   |director |marketing |26/09/45|8200
3212|shyam saksena    |d.g.m.   |accounts  |12/12/55|6000
3564|sudhir Agarwal   |executive|personnel |06/07/47|7500
2345|j.b. saxena      |g.m.     |marketing |12/03/45|8000
0110|v.k. agrawal     |g.m.     |marketing |31/12/40|9000

据我了解,行地址可以以模式的行号形式指定,以匹配文本或正则表达式。

我了解sed -n '1p' emp.lstsed -n '1,2p' emp.lst如何在不回显所有行(-n)的情况下分别打印第1行和第1&2行。

我也理解并欣赏sed -n '/director/p' emp.lst如何匹配包含字符串director的所有行,并输出:

9876|jai sharma       |director |production|12/03/50|7000
2365|barun sengupta   |director |personnel |11/05/47|7800
1006|chanchal singhvi |director |sales     |03/09/38|6700
6521|lalit chowdury   |director |marketing |26/09/45|8200

现在,当我将多个模式指定为sed -n '/director/,/executive/p' emp.lst时,显示的输出为:

9876|jai sharma       |director |production|12/03/50|7000
5678|sumit chakrobarty|d.g.m.   |marketing |19/04/43|6000
2365|barun sengupta   |director |personnel |11/05/47|7800
5423|n.k. gupta       |chairman |admin     |30/08/56|5400
1006|chanchal singhvi |director |sales     |03/09/38|6700
6213|karuna ganguly   |g.m.     |accounts  |05/06/62|6300
1265|s.n. dasgupta    |manager  |sales     |12/09/63|5600
4290|jayant Choudhury |executive|production|07/09/50|6000
6521|lalit chowdury   |director |marketing |26/09/45|8200
3212|shyam saksena    |d.g.m.   |accounts  |12/12/55|6000
3564|sudhir Agarwal   |executive|personnel |06/07/47|7500

此输出代表什么?

  • 是否所有行都包含模式directorexecutive?显然没有,因为有些行不包含任何一种模式。

  • 是不是所有的行都从第一个匹配任何一个模式直到最后一个匹配任何一个模式?再没有,好像我按照这种逻辑,输出中缺少一行(2476|anil aggarwal |manager |sales |01/05/59|5000)。

我无法清楚地推断出命令sed -n '/director/,/executive/p' emp.lst是如何工作的?我浏览了sed手册页,但无法推断。

我如何理解工作原理?

对于上下文,我正在运行内置在以Bash版本4.4运行的macOS High Sierra 10.13.6中的sed命令。

注意:我是sed的新手。请编辑我可能使用的任何错误或不正确的术语。

2 个答案:

答案 0 :(得分:1)

来自man sed

     0,addr2
          Start out in "matched first address"  state,  until  addr2  is  found.
          This  is  similar  to  1,addr2,  except that if addr2 matches the very
          first line of input the 0,addr2 form will be at the end of its  range,
          whereas  the 1,addr2 form will still be at the beginning of its range.
          This works only when addr2 is a regular expression.

不能100%确定这是否适用于手动部分,但看起来上面的输出中从“导演”到“执行”有2个块。 在第一个“导演”和第一个后继的“行政”之间还存在其他“导演”行。

答案 1 :(得分:1)

https://www.gnu.org/software/sed/manual/sed.html#Range-Addresses

  

可以通过指定两个用逗号(,)隔开的地址来指定地址范围。地址范围与从第一个地址匹配的行开始匹配,并一直持续到第二个地址(包括两端)匹配为止的行:

$ seq 10 | sed -n '4,6p'
4
5
6

因此1,2p并不意味着“打印第1行和第2行”,而是“打印第1行和第2行之间的所有行”。差异变得更加明显,例如3,7p,它将不仅打印第3行和第7行,而且还会打印第3、4、5、6、7行。

/director/,/executive/p打印开始行(匹配director)和结束行(匹配executive)之间的所有行。

在您的情况下,您有两个匹配范围(每个以director开头,以executive结尾):

9876|jai sharma       |director |production|12/03/50|7000
5678|sumit chakrobarty|d.g.m.   |marketing |19/04/43|6000
2365|barun sengupta   |director |personnel |11/05/47|7800
5423|n.k. gupta       |chairman |admin     |30/08/56|5400
1006|chanchal singhvi |director |sales     |03/09/38|6700
6213|karuna ganguly   |g.m.     |accounts  |05/06/62|6300
1265|s.n. dasgupta    |manager  |sales     |12/09/63|5600
4290|jayant Choudhury |executive|production|07/09/50|6000
6521|lalit chowdury   |director |marketing |26/09/45|8200
3212|shyam saksena    |d.g.m.   |accounts  |12/12/55|6000
3564|sudhir Agarwal   |executive|personnel |06/07/47|7500