grep со строками продолжения

У меня также есть этот принтер, таким образом, я записал драйвер, который можно использовать с ним.

Это - принтер GDI. Это использует PJL с изображениями JBIG1 для взаимодействия с хостом.

Можно загрузить этот драйвер с моей учетной записи GitHub, madlynx/ricoh-sp100.

Инструкции по установке:

  1. Скопируйте pstoricohddst-gdi в каталог фильтров чашек (обычно/usr/lib/cups/filter).
  2. Установите jbigkit пакет (jbitkit-мусорное-ведро в Ubuntu)
  3. Удостоверьтесь, что это - исполняемый файл пользователем альбома.
  4. Добавьте принтер через веб-интерфейс CUPS, нажмите 'Choose file' на страницу выбора драйвера и выберите предоставленный.PPD файл, продолжите устанавливать.

3
04.06.2015, 19:37
7 ответов

Другой подход с использованием perl для удаления новых строк, которым предшествует \ и пробела:

$ perl -pe 's/\\\n/ /' file | grep XXX
thisXXX line      has a continuation line
a  multipleXXX  continuation  line

Чтобы удалить лишние пробелы, пройдите через sed:

$ perl -pe 's/\\\n/ /' file | grep XXX | sed 's/  */ /g'
thisXXX line has a continuation line
a multipleXXX continuation line
5
27.01.2020, 21:07

С помощью pcregrep без изменения структуры строк:

pcregrep -M '^(.|\\\n)*XXX(.|\n)*?[^\\]$' file
4
27.01.2020, 21:07

с POSIX SED:

$ sed -e '
:1
/\\$/{N
  s/\n//              
  t1
}
/\\/!d 
s/\\[[:blank:]]*//g
' file
5
27.01.2020, 21:07

Я бы сказал Перл здесь самый простой . Это не POSIX, хотя по умолчанию он установлен в большинстве не встраиваемых юниксов. Если вы хотите POSIX, используйте awk.

awk '{if (/\\$/) printf "%s" $0; else print}'

Это рушит линии продолжения. Если вы хотите найти шаблоны, которые распространяются по продолжению, введите это в grep. Если необходимо найти только непрерывные детали, дайте awk собрать непрерывные линии и выполнить совпадение.

awk '{
    if (sub(/\\$/,"")) {
        line = line $0;
    } else {
        if (/XXX/) print;
        line = "";
    }
}'
3
27.01.2020, 21:07

Perl приходит на помощь:

perl -ne 'if (/\\$/) { $l .= $_ }
          else { print $l, $_ if $l =~ /XXX/;
                 $l = "";
          }' foo.txt

$ l работает как аккумулятор. -n обрабатывает ввод построчно (см. Sed), если строка заканчивается обратной косой чертой, она добавляется в аккумулятор, если нет, аккумулятор плюс строка печатается при условии, что она соответствует XXX, и аккумулятор опорожняется.

5
27.01.2020, 21:07

Мой поворот:

perl -0777 -ne '                           # read the entire file into $_
    s{ [[:blank:]]* \\ \n [[:blank:]]* }   # join continued lines
     { }gx;
    print grep {/XXX/} split /(?<=\n)/     # print the matching lines
' foo.txt 
thisXXX line has a continuation line
a multipleXXX continuation line
4
27.01.2020, 21:07

Это небольшое улучшение решения Gilles awk (спасибо Gilles!), но требует nawk:

nawk '{if (/\\$/) {$0=substr($0,1,length($0)-2); printf "%s",$0} else print}'

Это создаст непрерывную строку, если перенос строки, но не включает символ «\» и пробел. (Я нашел это полезным при поиске с помощью команды PATH, поскольку "\" может привести к путанице при интерпретации результатов.)

0
27.01.2020, 21:07

Теги

Похожие вопросы