Скопируйте строку, которая встречается перед определенным шаблоном.

Как насчет использования встроенной функции read 'bash' с символом периода в качестве разделителя для чтения каждого целого предложения в переменную, а затем заглавные буквы начального символа переменной? Что-то вроде

$ cat myfile
i am andrew. you
are jhon. here we are
forever.

$ while read -rd\. sntc; do printf "%s. " "${sntc^}"; done < myfile; printf "\n"
I am andrew. You
are jhon. Here we are
forever.

Для обработки нескольких терминаторов предложений, например. ? а также ! а также регулярный период, здесь используется другой подход с использованием «awk» - обратите внимание, что переменная RT, которая позволяет нам восстановить конкретный терминатор записи, который соответствует конкретному предложению, является расширением, которое может быть недоступно во всех вариантах «awk» '

$ cat myfile
i am andrew? you
are jhon. here we are
forever!

$ awk 'BEGIN{RS="[.!?]+[ \t\n]*"}; {sub(".", substr(toupper($0), 1,1), $0); printf ("%s%s", $0, RT)}' myfile
I am andrew? You
are jhon. Here we are
forever!

Обратите внимание, что вышеперечисленное выражение разделителя записей обрабатывает несколько последовательных разделителей ('!? !!! ') и необязательные конечные пробелы, которые нет в версии на основе чтения.

В качестве дополнительного улучшения попробуем добавить рудиментарное обращение с цитируемыми предложениями, изменив регулярное выражение RS еще раз и изменив sub так, чтобы в верхнем регистре был первый некатический символ:

[ f3]

, например

$ cat myfile
i am andrew.    "are
you jhon?"  'here we are
forever!?'

$ awk 'BEGIN{RS="[.!?]+[\"'\'']?[ \t\n]*"}; {match($0, "[^\"'\'']"); sub("[^\"'\'']", substr(toupper($0),RSTART,1), $0); printf ("%s%s", $0, RT)}' myfile
I am andrew.    "Are
you jhon?"  'Here we are
forever!?'
1
задан 18 June 2015 в 14:11

3 ответа

Вы можете использовать grep:

$ grep -m 1 TRAP-TYPE file
   emuEventTrapInformative TRAP-TYPE

-m 1 сообщает grep выйти после первого совпадения. Чтобы получить только часть emuEventTrapInformative, вы можете просто удалить TRAP-TYPE и любые пробелы, предшествующие ему:

$ grep -m 1 TRAP-TYPE file | sed 's/ *TRAP-TYPE//'
   emuEventTrapInformative

В качестве альтернативы вы можете использовать lookahead:

$ grep -Pom 1 '.*(?=TRAP-TYPE)' file 
   emuEventTrapInformative 

[F9] сообщает grep только распечатать согласованную часть строки, а функция -P позволяет использовать регулярные выражения, совместимые с Perl, которые поддерживают lookaheads.

4
ответ дан 23 May 2018 в 19:43

Вот версия sed:

sed -n 's/TRAP-TYPE//p' inp-file.txt

В примере, который вы указали, выход:

sed -n 's/TRAP-TYPE//p' inp-file.txt                                        
emuEventTrapInformative 

In ваш первоначальный вопрос, который вы запросили первый экземпляр TRAP-TYPE в файле. Если у вас более одного intance sed -n 's/TRAP-TYPE//p' | head -n1 будет делать трюк

Вот еще одна версия, которая извлекает несколько строк (на случай, если вам это нужно, когда-либо), если у вас есть несколько экземпляров TRAP-TYPE в файле.

$ awk 'BEGIN {RS="TRAP-TYPE"} NR>1{ print previous } {previous=$NF}' inp-file.txt                                                     
emuEventTrapInformative
someOtherString

Объяснение:

RS является разделителем записей. Мы делим весь текст на записи, используя TRAP-TYPE в качестве строки, затем печатаем последний элемент перед разделителем. Проблема в том, что последняя запись заканчивается фигурной скобкой. Поэтому, чтобы избежать этого, мы используем конструкцию NR>1{print previous}{previous=$NF}, чтобы мы могли игнорировать последнюю строку.

Пояснение

-- Traps
   emuEventTrapInformative TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }

-- Traps
   someOtherString TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }
2
ответ дан 23 May 2018 в 19:43

И вот версия Perl:

< inputfile perl -ne 's/^ +(.*) +TRAP-TYPE/$1/&&print'
-n: помещает цикл while (<>) {[...]} вокруг скрипта -e: читает скрипт из аргументов

Perl :

-n: помещает цикл while (<>) {[...]} вокруг скрипта /: запускает шаблон -e: читает скрипт из аргументов +: соответствует одному или нескольким символам (.*): соответствует и группирует любое количество символов перед одним или несколькими символами TRAP-TYPE: соответствует строке TRAP-TYPE /: останавливает шаблон / запускает заменяющую строку $1: заменяет захваченную группу /: останавливает замену строки / запускает модификаторы
1
ответ дан 23 May 2018 в 19:43

Другие вопросы по тегам:

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