сократите длинные линии в файле журнала

Необходимо перекомпилировать gstreamer0.10-ffmpeg с Вашим libx264 совместимый с 10 битами h264 кодек. Или скомпилируйте VLC с ним. Не забудьте использовать корректное --prefix в ./configure. Я рекомендую использовать VLC в этом случае.

5
18.06.2012, 20:30
5 ответов

В sed все команды могут быть снабжены префиксом условием, которое указывает что строки применить команду к. Общий вид условия является шаблоном поиска. Шаблон поиска /.\{250\}/ строки соответствий больше чем с 250 символами. Для таких строк соответствуйте первым 80 символам и последним 40, и замените целую строку префиксом, __ и суффикс.

sed -e '/.\{250\}/ s/^\(.\{80\}\).*\(.\{40\}\)$/\1__\2/'

Можно даже принять меры, чтобы шаблон заменяющей команды соответствовал только достаточно длинным линиям.

sed -e 's/^\(.\{80\}\).\{130,\}\(.\{40\}\)$//'
12
27.01.2020, 20:31
  • 1
    , я получаю Ваш 1-й пример (хотя не протестировали, если он все еще печатает более короткие неизменные строки). В Вашем 2-м примере разве среднее поисковое выражение не ловит строки точно 130 длин только (следовательно 250 символьных строк)? –  Marcos 19.06.2012, 11:50
  • 2
    я думаю, что вижу; то, что необходимо, является переменной длиной regex между 130 и 40 matchers. Таким образом, это могло бы быть финалом sed путь: sed -i.bak -e 's/^\(.\{80\}\).\{130,\}.*\(.\{40\}\)$/\1 ... \2/' Все, что они \делают это раздражающим для чтения, но я понимаю, почему они необходимы. awk путь более человекочитаем для кого-то не привыкшего к этим regexes. –  Marcos 19.06.2012, 12:00
  • 3
    @Marcos; Если Ваш situiation позволяет Вам использовать расширенный regex sed (опция -r), затем можно использовать более ясное ( ) и { } ... \( , и т.д. метод является более портативным. –  Peter.O 19.06.2012, 15:57

Я не знаю sed хорошо, таким образом, мое решение находится в awk:

awk 'length>250{len=length;$0=substr($0,1,80) "_" substr($0,len-40+1)};1' file
7
27.01.2020, 20:31
  • 1
    Хороший и краткий, спасибо. (Слишком плохо awk испытывает недостаток в-i оперативной опции замены файла как sed. Я буду просто awk ... file1 > file2 && mv -f file2 file1) –  Marcos 18.06.2012, 21:42
  • 2
    Незначительная деталь, я смог суметь обойтись без дополнительного len переменная в целом –  Marcos 18.06.2012, 23:04
  • 3
    @Marcos Быть осторожным с sed -i - это не портативно, и большинство версий, которые я видел, не обрабатывает специальные файлы (как символьные ссылки) правильно (это удалит ссылку и заменит его копией файла). –  jw013 03.10.2012, 20:36

Я не знаю sed хорошо, таким образом, мое решение находится в awk:

awk 'length>250{len=length;$0=substr($0,1,80) "_" substr($0,len-40+1)};1' file
7
27.01.2020, 20:31

Вот команда awk, которая сделает это:

awk 'len=length{if(len>250){print substr($0,0,80),"__",substr($0,len-40,len)}else{print $0}}' data.txt

Объяснение:

Если строка является дольше, чем 250 символами, долго печатают первые 80 символов, сопровождаемых строкой ___ и затем последних 40 символов.

Если строка короче, чем 250 символов, просто распечатайте исходную строку.

2
27.01.2020, 20:31

Существует pipeable способ извлечь первые 80 и продлиться 40, символы строки с sed, однако sed не имеет 'если операторы', таким образом, нет никакого пути непосредственно в sed, чтобы протестировать на длину строки и затем выполнить операцию на нем.

Получение первых 80 и последних 40 символов всех строк может быть, покончили | sed -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/'.

sed -i -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/' logfile

выполнит оперативную модификацию Вашего файла, но это ограничено работой на всех строках.

2
27.01.2020, 20:31
  • 1
    Также полезный ESP с-i, поскольку я могу надеяться сохранять ближе только к первым 1024 и длиться 1 024 символа, которые не должны изменять большинство строк, только смехотворно длинные. Тем не менее awk метод позволяет мне заменить середину "..." легко в таких случаях. –  Marcos 18.06.2012, 23:11
  • 2
    \1\_\2 кому: \1 ... \2 сделать то же с sed. HTH. –  Tim Kennedy 19.06.2012, 00:07
  • 3
    Почему использование \{120\} если OP, который попросили первых 80 символов? Ваша команда получает первые 120, и продержитесь 40 символов. Нет никакой потребности волноваться о замене, изменяющей короткие строки, потому что короткие строки никогда не будут соответствовать шаблону замены. Если бы Вы действительно хотели удостовериться, что короткие строки были нетронутыми, то Вы могли бы указать /.\{120,\}/ адрес для команды замены. –  jw013 19.06.2012, 00:38
  • 4
    ах, потому что я запутался и хотя он попросил первые 120. благодарит указать на это. :) –  Tim Kennedy 19.06.2012, 00:43

Теги

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