переменная sed шаблон для удаления строки

У меня была аналогичная проблема, но с iGPU Intel P530 с разрешением 4K. Мне также не хватало некоторых разрешений, включая 1920x1080p.

Я следовал указаниям здесь

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

Вы будете использовать либо gtf , либо cvt , чтобы получить модели для конкретного разрешения.

Оттуда вы будете использовать xrandr для установки новых режимов. Существует способ сделать его постоянным с помощью правила udev, но лично я использую скрипты.

Также я бы посоветовал не добавлять_60.0 после каждого только потому, что некоторым играм просто не нравится схема именования (У меня была эта проблема с Minecraft, как только я сохранил мод с именем 1920x1080 вместо 1920x1080 _60.0 было доступно в игре без фактического переключения на 1080p в X.

1
26.09.2019, 08:35
2 ответа

Я не знаю, является ли sedлучшим инструментом для этого. Я лично хожу в perlза такими вещами и придумал вот это:

perl -pe 'BEGIN{ $/ = " more items"; } s/\.\.\.\s\d+ more items$//;'

-e— текст программы для выполнения.

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

Это сначала устанавливает разделитель записей $/от новой строки по умолчанию(\n)до строки «больше элементов»; блок, обозначенный BEGIN { }, выполняется один раз в начале.

Теперь он будет считывать входные данные по одному блоку за раз, вплоть до (и включая )разделитель записей. Таким образом, в каждом цикле у вас есть «что угодно... еще 1234 элемента» во входном буфере.

s/\.\.\.\s\d+ more items$//— это замена, которая удаляет любую строку из трех точек (, экранированных для удаления специального значения «любого символа» ), за которым следует пробел (\s ), за которым следует одна или несколько цифр(\d+)и текст «больше элементов» в конце записи($). Сопоставление конца записи не обязательно, но может ускорить сопоставление.

Результат распечатывается по умолчанию благодаря опции -p.

1
27.01.2020, 23:30

Если вы используете GNU sed (, иногда называемую gsed), то длинные строки допустимы вплоть до предела памяти.

Если вы используете другой sed, например MacOS или BSD, будут ограничения. Руководство GNU sed объясняет:

For those who want to write portable sed scripts, be aware that some implementations have been known to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The POSIX standard specifies that conforming sed implementations shall support at least 8192 byte line lengths. GNU sed has no built-in limit on line length; as long as it can malloc() more (virtual) memory, you can feed or construct lines as long as you like.

Таким образом, если у вас есть GNU sed, вы можете использовать решение sed, предложенное @philippos:

sed 's/\.\.\. [0-9]* more items//g'

Использование awk

В качестве альтернативы, если у вас есть GNU awk (, иногда называемый gawk), попробуйте:

awk -v RS='\.\.\. [0-9]* more items' 1 ORS="" File

Таким образом, регулярное выражение \.\.\. [0-9]* more itemsиспользуется в качестве разделителя записей на входе и пустая строка в качестве разделителя записей на выходе. Это приводит к удалению любого совпадения регулярного выражения \.\.\. [0-9]* more items.

Поскольку awk считывает только одну запись за раз, это будет потреблять меньше памяти, чем решение sed.

1
27.01.2020, 23:30

Теги

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