Печать данных в файле между pattern1 и pattern2 без печати pattern2 - PullRequest
2 голосов
/ 05 марта 2020

Итак, у меня есть некоторые данные, которые выглядят так:

[SVP_VERSION_2]  
D:\CTD\01906932_2019_12_01\01906932_2019_12_01.svp  
Section 2019-335 10:55:14 18:53:56 -93:36:43  
0001.00 1539.85  
0002.00 1539.90  
0003.00 1539.83  
0004.00 1540.03  
Section 2019-335 10:55:14 18:53:56 -93:36:43  
0001.00 1540.05  
0002.00 1540.05  

Я хочу напечатать данные из первого «Раздела» в строку перед 2-м «Разделом» Вот так:

Section 2019-335 10:55:14 18:53:56 -93:36:43  
0001.00 1539.85  
0002.00 1539.90  
0003.00 1539.83  
0004.00 1540.03 

Я знаю, что могу использовать:

sed -n '/Section/,/Section/p' file 

, чтобы получить:

Section 2019-335 10:55:14 18:53:56 -93:36:43  
0001.00 1539.85  
0002.00 1539.90  
0003.00 1539.83  
0004.00 1540.03  
Section 2019-335 10:55:14 18:53:56 -93:36:43  

, но я хочу убрать конечную строку "Секция". Я также знаю, что могу передать вывод во второй sed, чтобы удалить последнюю строку, но я надеюсь сделать только один вызов sed. Это возможно?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Это может работать для вас (GNU sed):

sed -n '/^Section/{:a;p;n;//q;ba}' file

Отключить неявную печать -n и при сопоставлении строки, начинающейся Section, печатать эту строку и следующие строки, пока другая строка не совпадет с той же pattern.

Все строки перед одним началом Section будут игнорироваться, поскольку неявная печать отключена. Как только строка начинается с Section, команды между { и } выполняются.

Сначала устанавливается заполнитель :a. Затем текущее пространство шаблона печатается p, следующая строка заменяет текущее пространство шаблона введением n (он не печатает заменяемую строку, потому что -n предотвращает это), и эта строка проверяется, чтобы увидеть, он совпадает с последним регулярным выражением //q и, если он это делает, вся обработка прекращается (команда q обеспечивает это). Если она не совпадает, команда ba отправляет поток команд обратно заполнителю :a. Таким образом, все строки от начала строки Section до, но не включая начало следующей строки Section, печатаются и затем не более обработка завершена.

Альтернативное решение, приведенное ниже, достигает того же результата, но без использования переключателя -n, здесь команда d удаляет все строки перед началом одного Section, а команда Q завершает работу. обработка без печати текущей строки (которая будет вторым вхождением начала строки Section).

Альтернатива:

sed '/^Section/{:a;n;//Q;ba};d' file
1 голос
/ 05 марта 2020

Если у вас есть только две строки с Section и GNU sed, вы можете использовать

sed -rz 's/.*(Section.*)Section.*/\1/' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...