Извлечение уникального фрагмента текста из файла с помощью awk, sed или grep

Я мог бы быть неправым, но я не вижу способ выполнить это использование xcalib. Я действительно однако находил это askubuntu Вопросами и ответами названный: Как Вы устанавливаете системные профили цвета отображения в Xubuntu и Lubuntu?.

Походит colord и color-mgr инструменты для этой задачи.

4
19.05.2015, 23:36
3 ответа

с помощью ed:

ed -s <<'IN'
r !pactl list sink-inputs
/VLC/+,$d
?Sink Input?,.p
q
IN

оно r заносит вывод команды в текстовый буфер, d поднимает все после первого совпадения строки VLC, а затем p отпечатки с предыдущего совпадения строки Sink Input до текущей строки.

С помощью sed:

pactl list sink-inputs | sed -n 'H;/Sink Input/h;/VLC/{x;p;q}'

присоединяется каждая строка к старому буферу H, если строка совпадает с Sink Input перезаписывает старый буфер h, а если строка совпадает с VLC, то ex меняет место удержания w. pattern space, prints и quits.

7
27.01.2020, 20:46

Я бы использовал режим абзаца Perl:

pactl list sink-inputs | perl -00ne 'print if s/(.*?VLC.*?\n).*/$1/ms' 

The -00 устанавливает разделитель входных записей на \n\n, так что "строка" - это абзац. Затем подстановка будет соответствовать всему до первой VLC, а затем всему до 1-й новой строки и сохранит их как $1. После этого все удаляется (так как мы заменяем все на $1). Наконец, "строки", в которых эта замена прошла успешно, печатаются.

6
27.01.2020, 20:46

Это фактически многострочные записи, разделенные пустой строкой. Awk отлично подходит для работы с такими данными:

pactl list sink-inputs | awk -v RS="" '/VLC/' 

Если вы хотите быть очень щепетильным в том, чтобы не включать нижнюю часть записи после первого появления "VLC", то:

pactl list sink-inputs | awk -v RS="" -v FS="\n" '/VLC/{ for(i=1; i<=NF; i++) { print $i; if($i ~ /VLC/) exit}}' 
3
27.01.2020, 20:46

Теги

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