sed - адресация с использованием двух строк - PullRequest
0 голосов
/ 10 сентября 2018

Я собираю сед.У меня проблемы с пониманием того, как работает адрес строки в 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.lst и sed -n '1,2p' emp.lst выводят на печатьСтрока 1 и строка 1 и 2 соответственно без повторения всех строк (-n).

Я также понимаю и ценю, как 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

Что означает этот вывод?

  • Это все строки, содержащие шаблон director и executive?Ясно, что нет, поскольку есть строки, не содержащие ни одного из шаблонов.

  • Все ли строки начинаются с того, что первая соответствует одному из шаблонов, а последняя соответствует одному изшаблоны?Нет, опять же, как если бы я придерживался этой логики, одна строка (2476|anil aggarwal |manager |sales |01/05/59|5000) отсутствует в выводе.

Я не смог четко определить, как команда sed -n '/director/,/executive/p' emp.lstработает?Я просмотрел man-страницу sed и не смог сделать вывод.

Как мне подойти к пониманию работы?

Для контекста я запускаю команду sed, встроенную в macOS HighSierra 10.13.6 работает в Bash версии 4.4.

Примечание : я sed новичок.Пожалуйста, исправьте любую ошибку или неправильную терминологию, которую я мог использовать.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

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       |<b><em>director</em></b> |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 |<b><em>executive</b></em>|production|07/09/50|6000
6521|lalit chowdury   |<b><em>director</b></em> |marketing |26/09/45|8200
3212|shyam saksena    |d.g.m.   |accounts  |12/12/55|6000
3564|sudhir Agarwal   |<b><em>executive</b></em>|personnel |06/07/47|7500
0 голосов
/ 10 сентября 2018

С 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 блока от «директора» до «руководителя». Между первым «директором» и первым последующим «руководителем» есть некоторые другие линии «директора».

...