Удаление символов новой линии между образцами

С помощью awk

awk '{x=$0; gsub(/[^[:alpha:]]/, "", x)};length(x) == 2' file

Это устанавливает каждую строку в переменную x с последующей заменой всех неальфа-символов в пределах x пустой строкой. Если длина измененного таким образом x равна 2 , соответствующая строка квалифицируется как

Альтернативно, с grep

grep '^[^[:alpha:]]*[:[:alpha:]][^[:alpha:]]*[:[:alpha:]][^[:alpha:]]*$' file
1
18.09.2018, 12:25
3 ответа

Сawk:

awk '
  $0 == "foo" {if (sep) print ""; sep = ""; inside = 1; next}
  $0 == "bar" {inside = 0; next}
  inside {printf "%s", sep $0; sep = " "}
  END {if (sep) print ""}'

Чтобы сопоставить строки с fooв качестве первого слова, замените $0 == "foo"на $1 == "foo"; чтобы соответствовать строкам, начинающимся с foo, замените на/^foo/(сокращение от$0 ~ /^foo/).

2
27.01.2020, 23:14

Перл спешит на помощь!

perl -ne '
    if ($e = /^foo$/.. /^bar$/) {
        if ($e =~ /E/) { print "\n" }
        else {
            chomp;
            print " " if $e > 2;
            print     if $e > 1;
        }
}' -- input.txt
  • -nсчитывает ввод построчно
  • ..— это оператор диапазона, он возвращает относительный номер строки для каждой строки в блоке. К последней строке добавлено E0.
2
27.01.2020, 23:14

Вы могли бы сделать и так:

a )Это POSIX-sedсовместимый код, в котором мы сохраняем средние -строки диапазона (!/foo/ и !/bar/ )в области удержания.

sed -e '
    /foo/,/bar/!d
    /foo/d
    /bar/!{H;$!d;}
    s/.*//;x;s/^\n//;y/\n/ /
' input-file.txt

b )и с Perl, как показано

perl -lne '
   next unless /foo/... /bar/;
   push(@A, $_),next if !/foo/ && !/bar/ && !eof;
   push(@A, $_)      if !/foo/ && !/bar/ &&  eof;
   print join " ", splice @A if /bar/ || !/foo/ && eof;
' input-file.txt

Пояснение:

  • пропускать не -неинтересные строки или строки, выпадающие из допустимого диапазона. Диапазон определяется как начинающийся со строки, содержащей /foo/, и заканчивающийся на /bar/, причем обе строки расположены на разных строках.
  • Когда мы находимся в диапазоне, то выполняем отдельные действия в зависимости от того, в какой линии мы находимся.
  • Для строк, которые не являются /foo/, ни /bar/, ни eof :сохраняют строку в массиве @A. После сохранения вернитесь для чтения следующей записи, предоставленной не eof.
  • Только для конца диапазона, то есть /bar/или eof, мы печатаем то, что находится в @A, а также очищаем его, готовясь к следующему циклу сбора.
1
27.01.2020, 23:14

Теги

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