Вы настаиваете на использовании sed? Это легко, например, в Python. И без сомнения, даже легче в Perl. Хотя вопрос не очень хорошо определен. Скопируйте файл, удалив все строки длиннее 2048 или что-то еще?
Я получаю сообщение об ошибке sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi
1
@wedi вы, вероятно, хотите установить версию GNU вместо версии BSD, которая поставляется с Mac. Это легко с варкой
Freedom_Ben
Вопрос гласит: «Если дольше, чем XY (например, 2048 символов)». Тогда это должно быть> 2048, а не => 2048
ajcg
1
@ajcg,> 2048. Обратите внимание, что в конце регулярного выражения есть дополнительный период, соответствующий 2049-му символу.
Forcefsck
@forcefsck, и было бы лучше, если бы ты убрал это "^"? (с помощью вашей команды вы удаляете только строки, которые «начинаются с XYZ», но если XYZ находится в другой части строки, он не удаляет его)
ajcg
7
Вот решение, которое удаляет строки, содержащие 2049 или более символов:
sed -E '/.{2049}/d' <file.in >file.out
Выражение /.{2049}/dбудет соответствовать любой строке, которая содержит не менее 2049 символов, и удаляет их из входных данных, создавая только более короткую строку в выходных данных.
Лично, @Faheem, я предпочитаю твой ответ. Причина в том, что мне было очень легко превратить его в «удалить все строки меньше x». Я не использую Python все время, но когда я это делаю, я всегда чувствую, что должен хорошо его изучить.
ixtmixilix
@ixtmixilix: Да, использование полнофункционального языка, такого как Python, довольно гибко. Спасибо за комментарий.
LOL, но sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
Алекс
Ах. Я установил версию GNU вместо версии BSD, которая поставляется с Mac, как предложено выше @Freedom_Ben. Но Кусалананда нашел возможность включить расширенное регулярное выражение. Так что вы должны пойти с его решением, если у вас все еще есть эта проблема. ;)
Веди
0
С gnu-sed вы можете использовать флаг -r, чтобы не вводить обратную косую черту, и запятую, чтобы определить открытый интервал:
sed -r "/.{2049,}/d" input.txt > output.txt
с:
х {2049} означает ровно 2049 хс
х {2049,3072} значение от 2049 до 3072 хс
х {2049,} означает не менее 2049 хс
х {, 2049} значение не более 2049 хс
Для интервалов, чтобы не соответствовать большим шаблонам, вам понадобятся линейные якоря, такие как
Ответы:
источник
sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)
(Mac OS X)Вот решение, которое удаляет строки, содержащие 2049 или более символов:
Выражение
/.{2049}/d
будет соответствовать любой строке, которая содержит не менее 2049 символов, и удаляет их из входных данных, создавая только более короткую строку в выходных данных.С
awk
, печать строк длиной 2048 или короче:Подражая
sed
решению буквально сawk
:источник
sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)
(Mac OS X)Нечто подобное должно работать в Python.
источник
источник
-l
не нужно.Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
length($_) > 2048 && print
.length
вlength($_)
любом случае это ярлык .Приведенные выше ответы не работают для меня в Mac OS X 10.9.5.
Следующий код работает:
sed '/.\{2048\}/d'
,Хотя и не просили, но предоставили для справки, обратное может быть достигнуто следующим кодом:
sed '/.\{2048\}/!d'
,источник
sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)
(Mac OS X, 10.10.4
)С gnu-sed вы можете использовать флаг -r, чтобы не вводить обратную косую черту, и запятую, чтобы определить открытый интервал:
с:
Для интервалов, чтобы не соответствовать большим шаблонам, вам понадобятся линейные якоря, такие как
источник