Как удалить все строки в текстовом файле, содержащие менее 'x' символов?

Файловая система FAT32 имеет минимальный размер :, она должна содержать не менее 65525 кластеров. Размер кластера кратен размеру сектора.В вашем случае размер сектора равен 4096, а mkfs.vfatиспользовал значение по умолчанию, кратное 8, для количества секторов в кластере. Используйте -s 1, чтобы указать один сектор на кластер :

.
mkfs.fat -v -F 32 -S 4096 -s 1 /dev/sde1

Это приводит к размеру кластера 4096, который должен быть достаточно мал, чтобы вместить больше, чем минимум 65525 кластеров в вашем разделе размером 264 МБ.

8
14.04.2020, 17:02
6 ответов

Предположим, вы хотите удалить строки, которые содержат менее nграфических символов:

awk -v n=5 '{ line = $0; gsub("[^[:graph:]]", "") } length >= n { print line }'

При этом удаляются все символы, не соответствующие [[:graph:]]. Если длина оставшейся строки больше или равна n, печатается немодифицированная строка ().

Значение nзадается в командной строке.

[[:graph:]]эквивалентно [[:alnum:][:punct:]], что, в свою очередь, совпадает с [[:alpha:][:digit:][:punct:]]. Это примерно то же самое, что и [[:print:]], но не соответствует пробелам.

Вместо [^[:graph:]]вы можете использовать [[:blank:]]для удаления всех вкладок или пробелов.

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

sed -e 'h; s/[^[:graph:]]//g' \
    -e '/.\{5\}/!d; g'

или упрощенно (, считая только не -пустые символы ),

sed -e 'h; s/[[:blank:]]//g' \
    -e '/...../!d; g'

Это сначала сохраняет текущую строку в ячейке хранения с помощью h. Затем он удаляет все не -графические символы (или пустые символы во второй вариации )в строке с s///g. Если строка содержит менее 5 символов (, измените это число на любое желаемое или измените количество точек во втором варианте ), строка будет удалена. В противном случае сохраненная строка извлекается из области хранения с неявным выводом gи ().

13
19.03.2021, 02:29

Это удалит строки, содержащие 10 и менее 10 символов:

sed -E '/^.{1,11}$/d' filename

ИЛИ

sed -r '/^.{1,11}$/d' filename  

Если вы хотите обрезать пробелы, вы можете использовать:

sed -E 's/^[[:space:]]*//g;s/[[:space:]]*$//g;/^.{1,11}$/d' filename

Если вы хотите сделать в -место (непосредственно внутри файла )удалить, используйте опцию-i с ним.

2
19.03.2021, 02:29
sed -e 's/[^[:space:][:cntrl:]]/&/20' -e t -e d < file

напечатает строки file, которые содержат не менее 20 не -пробелов, не -управляющих символов (см. также [[:graph:]]или [[:alnum:][:punct:]], неясно, какие символы вы хотите включить/ исключить из вашего описания; имейте в виду, что в некоторых системах неразрывный -символ пробела -включается в graph, а не вspace).

Идея состоит в том, что он пытается заменить 20-е вхождение не -пробельного/управляющего символа самим собой (&), и мы ответвляемся, если эта замена выполняется успешно (t), таким образом пропуская dдействие (, чтобы удалить ).

С помощью awkможно сделать:

awk 'gsub(/[^[:space:][:cntrl:]]/, "&") >= 20' < file

Основываясь на том факте, что gsub()возвращает количество сделанных замен.

Сgrep:

grep -E '^([[:space:][:cntrl:]]*[^[:space:][:cntrl:]]){20}' <  file

((.*[^[:space:][:cntrl:]]){20}тоже подойдет, но будет дороже ).

7
19.03.2021, 02:29
perl -pi.bak -e '$_ = "" unless length > 20' file1 file2

Это позволяет использовать строки (, включающие "\n" ), содержащие x+1 или более символов.

-1
19.03.2021, 02:29
 perl -n -e 'print if tr/!-\176// > 38'

, где 38 — это количество символов, отличных от -.

Если вы ищете конкретный список не -пробельных символов , не стесняйтесь вставлять их между первыми двумя / в tar, либо по отдельности, либо с помощью " -" указание диапазона :например

 tr/A-Za-z0-9//

Если вам нужно -, чтобы быть одним из них, поставьте -первым.

Если вам нужно/быть одним из них, закодируйте его как \057.

tr/A-Za-z0-9\057+//          # match characters in Base64

Кровавые подробности

perl -eозначает, что программа Perl находится в командной строке.
perl -n -eозначает повторение этой программы в каждой строке ввода, т. е. обертывание ее внутри perlwhile (<>) { your code here }

Во время итерации perl всасывает входные данные в метапеременную с именем $ _.

Это также цель по умолчанию для большинства команд (, включая print и tr ).

command if condition- это идиома perl для "если (условие ){команда}"

tr///— оператор транслитерации , например. tr/ABC/abc/означает замену каждого A на a, B на b и C на c. Оператор -означает диапазон,поэтому tr/A-Z/a-z/означает весь алфавит. Null во втором поле означает, что строку не менять. Возвращаемое значение оператора tr/// — это количество совпадающих символов.

Раздутый в толстый код, этот код выглядит как

 $textstart = "!";    # first character after space
 $textend = "\176";   # last printable character in octal; dec 126 or 0x7E 
 $textrange = $textstart. "-". $textend; 

 while (defined ($_ = <STDIN>) ) {    # while able to suck a line from STDIN into $_

     if ( {$_ =~ tr/$textrange//}     # count desired characters within textrange 
                                  > 38  )   # compare to 38
     {                                # start if block
           print $_;                  # If valid, print raw input
     }                                # end if block   

 }  # end while
2
19.03.2021, 02:29

Использование Раку (урожденная Perl6)

raku -ne '.put if chars( S:g/\s// ) >= 10;'  filename

или

raku -ne '.put unless chars( S:g/\s// ) < 10;'  filename

или

raku -ne '.put unless chars( S:g/\W// ) < 10;'  filename

или

raku -ne '.put unless chars( S:g/<ws>// ) < 10;'  filename

Вкратце, в Raku/Perl6 оператор «заглавная -S» S///используется для создания результирующей строки, лишенной нежелательных символов (, например. пробелы ), символы результирующей строки подсчитываются с помощью функции chars, сравниваются с «n» (, используя 10 в качестве примера ), и, наконец, --, если логическое значение удовлетворяется--.putвернет исходную строку без изменений.

Примечание 1:«S/// использует ту же семантику, что и оператор s///, за исключением того, что он оставляет исходную строку нетронутой и возвращает результирующую строку вместо $/ ($/ все еще установлено в значение те же значения, что и с s/// )».

https://docs.raku.org/language/regexes#S///_non-destructive_substitution

Примечание 2 :В Raku/Perl6 модификаторы регулярных выражений, такие как:g(для «глобального» ), известны как наречия и (обычно )помещаются в начало S///или s///. ] сразу после Sили s.

Примечание 3 :Точка .в Raku/Perl6 используется для вызова метода для переменной темы $_, поэтому первое «слово» кода .putпо сути является сокращением для $_.put.

https://docs.raku.org/language/5to6-nutshell#-%3E_Method_calls

Примечание 4 :Raku/Perl6 имеет гораздо более ограниченный набор флагов командной строки. Флаг -e(«выполнить» )запускает код Raku/Perl6 в командной строке. Флаг -nзапускает код Raku/Perl6 построчно, т. е. для каждой строки входного файла по одной строке за раз, возвращая результат.Два флага могут быть объединены в флаг -ne, но в любом случае флаг -eдолжен быть последним.

Perl _6 ссылок:
https://docs.raku.org/language/5to6-nutshell#Command-line_flags
https://github.com/rakudo/rakudo/wiki/Running-rakudo-from-the-command-line

0
19.03.2021, 02:29

Теги

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