Соответствие шаблонов через линии - PullRequest
0 голосов
/ 21 января 2019

Предположим, у меня есть файл, который содержит:

something  
line=1  
file=2  
other  
lines  
ignore  

something  
line=2  
file=3  
other  
lines  
ignore  

В конце концов, мне нужен уникальный список комбинаций строк и файлов в каждом разделе.На первом этапе я пытаюсь заставить sed выводить только эти строки, объединенные в одну строку, например

line=1file=2  
line=2file=3

Затем я могу использовать sort и uniq.

Поэтому я пытаюсь

sed -n -r 's/(line=)(.*?)(\r)(file=)(.*?)(\r)/\1\2\4\5/p' sample.txt

(это не обязательно просто число после каждого)

Но оно не будет совпадать между строк.Я пробовал \ n и \ r \ n, но это не похоже на стиль новой строки, так как:

sed -n -r 's/(line=)(.*?)(\r)/\1\2/p' sample.txt

выведет строки "line =", но я просто не могузаставить его охватить новую строку, а также собрать вторую строку.

1 Ответ

0 голосов
/ 21 января 2019

По умолчанию sed будет работать только для фрагментов, разделенных символом \n, поэтому вы никогда не сможете совпасть по нескольким строкам.Некоторые реализации sed поддерживают параметр -z, который позволяет работать с чанками, разделенными символом ASCII NUL вместо символа новой строки (это может работать для небольших файлов, при условии, что символ NUL не повлияет на шаблон, которому вы хотите соответствовать)

Есть также некоторые sed команды, которые можно использовать для многострочной обработки.

sed -n '/line=/{N;s/\n//p}'
  • N команда добавит следующую строку к текущей обрабатываемой части (которая должнасоответствует line= в данном случае)
  • s/\n//p, затем удалите символ новой строки, чтобы получить вывод в виде одной строки

Если у вашего ввода есть конец строки в стиле DOS,сначала преобразуйте его в стиль Unix (см. Почему выходные данные моего инструмента перезаписываются и как его исправить? ) или также позаботьтесь о \r

sed -n '/line=/{N;s/\r\n//p}'

Обратите внимание, что этиКоманды были протестированы на GNU sed, синтаксис может отличаться для других реализаций

...