sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Редактирование 1:
Я, как предполагается, объясняю это, таким образом...
Это излишне сложно. Я не знал, что в диапазонах адресов позволяют {}
. Таким образом, я должен был выразить, "удаляют пустые строки" по-другому. Базовая команда t
который является способом sed if ... then
. T
было бы легче, но доступен для GNU sed только. Я цитирую страницу справочника:
t маркировка: Если s///сделал успешную замену, так как последняя входная строка была считана и начиная с последнего t или команды T, то перейдите для маркировки; если маркировка опущена, ответвление к концу сценария.
Я злоупотребляю известным s
команда. Это ничего не должно заменять кроме теста только, пуста ли строка. Таким образом, это заменяет пустую строку пустой строкой (мог использовать что-либо в качестве замены, поскольку строка удалена так или иначе).
Если s
сделал "замену" затем, строка пуста. В этом случае команда d
буду выполняться. Иначе ничто не должно быть сделано. Как t
не переходит в случае s
действие мне нужна команда ответвления b
переходить в конец сценария. : label
цели ответвления. Как goto
тогда в средневековье (когда sed был изобретен..., хихикают).
Другая опция состояла бы в том, чтобы иметь s
"замените" все непустые строки, делая s
более сложный, но отдых легче команды:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$
означает "непустую строку" и \1
означает "содержание первых скобок".
Краткое решение с использованием grep:
ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"
Здесь,
[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s ==> space
{4} ==> exactly four matches
-121--70716- Это работает для меня:
ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'
Дополнительный флаг -n
для ls
превращает имена пользователей и групп в числовые идентификаторы. В результате мы получаем известное количество полей для выделения:
-rwxr-xr-x 1 1001 1001 1.4K Mar 23 18:07 something.sh
Пробел между каждым из столбцов является переменным, но это то, что ls
использует для выравнивания столбцов, поэтому мы не можем просто слепо удалить его. Я решил удалить ведущий блок разрешений, за которым следуют три группы пробел-текст, а затем не пробел-текст , соответствующие количеству ссылок, uid и gid соответственно. Это оставляет пробел, отделяющий gid от файла, нетронутым, так что выравнивание может продолжать работать. Регулярное выражение sed
реализует это удаление шаблона. #... #... #
предоставляет разделители ( совпадают и заменить ), а флаг -r
позволяет использовать расширенные регулярные выражения. Рассекая, что у нас есть ^
совпадающее начало строки; \S +
соответствует одному или нескольким символам, не являющимся пробелами, и \s +
соответствует одному или нескольким символам, не являющимся пробелами; скобки (...)
объединяют эти два элемента, а скобки {3}
указывают, что группа должна повторяться три раза.
4.0K Jun 6 2014 template
4.0K May 21 17:35 stuff
0 Mar 16 09:46 Items
1.4K Mar 23 18:07 something.sh
24K May 19 14:45 curtain
-121--70714- Для пропуска столбцов пользователя и группы используйте опции -o
и -g
. Поскольку имена пользователей и групп могут содержать пробелы, их невозможно надежно отредактировать.
Отсутствует возможность пропуска столбцов разрешений и количества ссылок. Поскольку первый столбец, который требуется сохранить, может начинаться с пробела (для выравнивания справа), в качестве критерия начала нельзя использовать переход от пробела к пробелю. Вместо этого используйте правый край последнего столбца, чтобы исключить ненужные столбцы. Это безопасно, поскольку первые два столбца не могут содержать встроенные пробелы.
ls -lhog | sed 's/^[^ ][^ ]* *[^ ][^ ]* //'
Объяснение команды sed:
s/ REGEXP / REPLACEMENT /
заменяет первое вхождение указанного регулярного выражения в каждой строке указанным текстом замены. Здесь текст замены пуст. ^
в начале regexp делает его совпадающим только в начале строки. [^] [^] *
соответствует любой непустой последовательности символов, отличной от пробела. Это работает для меня:
ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'
Дополнительный флаг -n
к ls
превращает имена пользователей и групп в числовые идентификаторы. В результате мы получаем известное количество полей для выравнивания:
-rwxr-xr-x 1 1001 1001 1.4K Mar 23 18:07 something.sh
Пробела между каждым из столбцов переменны, но это то, что ls
использует для выравнивания столбцов, поэтому мы не можем просто вырезать их вслепую. Я решил удалить ведущий блок разрешений, за которым следуют три группы пробельного текста, затем не пробельного текста, соответствующие счетчику ссылок, uid и gid соответственно. Это оставляет пробельные символы, отделяющие gid от файлов, нетронутыми, так что выравнивание может продолжаться. Регулярное выражение sed
реализует это удаление шаблона. #...#...#
предоставляет разделители (match и replace), а флаг -r
позволяет использовать расширенные регулярные выражения. Отключая, что ^
совпадает с началом строки; \S+
совпадает с одним или несколькими небелопробельными символами, а \s+
с одним или несколькими пробелами; заключенный в скобки (. ...)
группируют эти два элемента вместе, а в скобках {3}
указано, что группа должна быть повторена три раза.
4.0K Jun 6 2014 template
4.0K May 21 17:35 stuff
0 Mar 16 09:46 Items
1.4K Mar 23 18:07 something.sh
24K May 19 14:45 curtain
Присоединившись к хору, вы также можете использовать awk
для опустошения колонок, которые вам не нужны:
[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'
4.0K Aug 19 2014 Desktop
4.0K Jan 8 22:39 dir1
4.0K Feb 5 20:41 Documents
12K May 22 19:31 Downloads
4.0K Aug 19 2014 Music
4.0K May 3 20:00 Pictures
4.0K Aug 19 2014 Public
115K May 9 09:05 something.bin
4.0K Aug 19 2014 Templates
1 Dec 12 07:01 testLink -> .
4.0K Aug 19 2014 Videos
[jis@localhost ~]$
Отличное решение с использованием grep:
ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"
Здесь
[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s ==> space
{4} ==> exactly four matches