Как получить определенные части текста? -grep/regex

https://stackoverflow.com/questions/3433203/how-to-determine-if-lcd-monitor-is-turned-on-from-linux-command-line нашел код сценария оболочки для проверки, а-ля:

#!/bin/bash export DISPLAY=:0.0

 if [ $# -eq 0 ]; then   
 echo usage: $(basename $0) "on|off|status"    
 exit 1  
fi  

 if [ $1 = "off" ]; then   
  echo -en "Turning monitor off..."   
  xset dpms force off   
  echo -en "done.\nCheck:"  
  xset -q|grep "Monitor is"  

 elif [ $1 = "on" ]; then   
 echo -en "Turning monitor on..."
 xset dpms force on   
 echo -en "done.\nCheck:"   
 xset -q|grep "Monitor is"  

 elif [ $1 = "status" ]; then   
 xset -q|sed -ne 's/^[ ]*Monitor is //p' 

 else    
 echo usage: $(basename $0) "on|off|status"   

 fi  

-2
11.03.2021, 21:33
3 ответа
cut -d, -f 5 FILE

даст нужные вам результаты. Это вытягивает пятый столбец, разделенный запятой.

3
18.03.2021, 22:25

Я предположил, что у вас есть заголовок, за которым следует LM.... Вот вам регулярное выражение:

sed "s/\([^,]*, *\)\{4\}\(.*\), LM.*/\2/" booksdata

Данные содержатся в файле booksdata. Регулярное выражение \([^,]*, *\)\{4\}захватывает 4 экземпляра полей, разделенных символом ,с необязательным пробелом в конце. Использование LM...позволяет использовать запятую в названии книги.

0
18.03.2021, 22:25

Самое простое решение, при условии, что в полях ваших данных нет встроенных запятых или новых строк, заключается в использовании cut -d, -f 5 file, возможно, с некоторой пост-обработкой -, чтобы избавиться от начальных пустых символов, которые останутся(sed 's/^[[:blank:]]*//'удалит эти ).

Извлечение данных с помощью grepневозможно, если у вас нет нестандартного -варианта grep, который понимает параметр -o. Стандарт grepизвлекает только совпадающие строки из файлов.

Сопоставление определенных полей с использованием регулярных выраженийи часто приводит к нечитаемому (и, следовательно, неподдерживаемому )коду, который ломается, как только обнаруживается крайний случай.

В этом случае лучше использовать инструмент, умеющий делить ввод на отдельные поля, например cutвыше илиawk(ниже ). Если выяснится, что ваши данные на самом деле являются файлом CSV, вы можете взглянуть на csvkitи его утилиту csvcut, потому что CSV — это структурированный формат со специальными правилами цитирования и кодирования, которые простые инструменты, такие как grep, sedи awkс трудом справятся.


awk -F ',[[:blank:]]*' '{ print $5 }' file

В этом используется регулярное выражение , чтобы указать, что является разделителем в ваших данных (запятая, за которой следуют необязательные пробелы ). Пятое такое поле извлекается и печатается в каждой строке.

Это предполагает, что ни одно поле не содержит встроенных запятых (или новых строк ).

Учитывая входные данные в вопросе, это будет генерировать

Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems

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

tr ',' '\n' <file | sed '5~9!d; s/^[[:blank:]]*//'

Это просто заменяет все запятые на новые строки, затем печатает каждую 9-ю строку, начиная с строки 5 (фактически удаляет каждую строку, которая не является одной из этих строк, и печатает оставшиеся строки ). Регулярное выражение используется для отключения начальных пробелов в начале каждой строки перед их печатью.


Просто так:

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

Поле в начале можно удалить с помощью s/^[^,]*,//в sed, а поле в конце можно удалить с помощью s/,[^,]*$//. Команда tв sedпереходит к данной метке, если последняя команда s///внесла изменения. Команда :вводит метку.

$ sed -e ': again' -e 's/^[^,]*,//; s/,[^,]*$//' -e 't again' -e 's/^[[:blank:]]*//' file
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems
1
18.03.2021, 22:25

Теги

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