Как я использую сокращение для разделения несколькими пробела?

Если Ваше намерение состоит в том, чтобы использовать для своей выгоды каталог, и Вы используете bash 4 + это должно сделать:

find . -type d -name doc -print0 \
| while read -rd $'\0' file; do
    dname=$(dirname "$file")
    fname=$(basename "$file")
    mv "$file" "$dname"/"${fname^}"
  done

Отметьте использование \0 гарантировать корректную обработку необычных имен файлов.

Обновление

Поскольку jw013 указывает в комментариях ${var^} не работает, как я ожидал. Я исправил ответ, чтобы разделить путь к каталогу и имени файла и применяться ^ оператор только к $fname.

Btw, благодарит стремление добавить недостающий канал.

25
18.01.2014, 02:04
6 ответов

Отвечать на Ваш вопрос буквально:

sed 's/   */:/g' | cut -d : -f 5

или

awk -F '  +' '{print $5}'

Но так не пойдет, если число в скобках достигает 10 и т.д. Если Вы только интересуетесь числами, Вы могли бы удалить все остальное.

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6
17
27.01.2020, 19:40
  • 1
    да, конечно только числа, но только Ваш 3-й пример работает правильно, –  rubo77 18.01.2014, 02:08
  • 2
    @rubo77 для меня. Первые два примера делают точно, что Вы спрашиваете в своем заголовке. Или Вы хотели снять изоляцию с единицы также? В этом случае добавить | sed 's/ .*//' в конце первых двух примеров. Конечно, существует много других способов сделать это. –  Gilles 'SO- stop being evil' 18.01.2014, 02:13
  • 3
    немного короче с + вместо *: тест кошки | sed's / [^.0-9] \+/:/g' | сократил-d:-f 6 –  rubo77 01.09.2016, 11:29
  • 4
    @rubo77, Если Ваш sed поддерживает его, который является. Это поддерживается GNU и BusyBox, но не, например, BSD или Солярис. POSIX указывает + и ? в ДО, но листы \+ и \? в неопределенном BRE. –  Gilles 'SO- stop being evil' 01.09.2016, 11:57

Эти команды все распечатают последний столбец разделенного файла пространства:

  • awk '{print $NF}' file

    в awk, NF количество полей и $NF последнее поле.

  • perl -lane 'print $F[$#F]' file

    -a разделяет файл на пробеле в массив @F, $#F число элементов в массиве так $F[$#F] последний элемент. -n средства читают файл, данный на командной строке, и применяются, сценарий передал с -e к каждой строке. -l просто добавляет символ новой строки (\n) каждому print оператор.

  • sed 's/.* //g'

    простое регулярное выражение, которое соответствует всему к последнему пространству и удаляет его, оставляя только последний столбец.

  • rev file | cut -d' ' -f 1 | rev

    rev инвертирует его вывод, таким образом, последнее поле является первым, cut с разделителем располагают с интервалами для печати его и rev инвертировать текст назад к нормальному. Выигранный' t работает, если у Вас есть последовательный пробел.

На основе Вашего входа я предполагаю, что Вы на самом деле не хотите последний столбец, но предпоследний или два последних. В этом случае используйте их для печати последних 2 (8.39 Mbits/sec):

awk '{print $(NF-1),$NF}' file 
perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)/\1/' file 
rev file | cut -d' ' -f 1,2 | rev

и они для печати предпоследнего (8.39):

awk '{print $(NF-1)}' file 
perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*/\1/' file 
rev file | cut -d' ' -f 2 | rev
5
27.01.2020, 19:40

Вы не можете разделить несколько вхождений пробелов с помощью cut в соответствии с руководством:

Поля вывода разделяются одним вхождением символ-разделитель полей.

, если текст не разделен на одинаковую величину или вы не используете tr , чтобы удалить лишнее.

В противном случае используйте альтернативные инструменты, такие как awk , sed или ex .

Например:

ex -s +'%norm $2Bd0' +%p +q! foo.txt

Заменить + q! с -cwq , чтобы сохранить изменения на месте.

4
27.01.2020, 19:40

Если мы используем команду tr вместе с параметром squeeze (флаг -s ), чтобы преобразовать все несколько последовательных пробелов в один пробел, а затем выполнить ] cut с пробелом в качестве разделителя - мы можем получить доступ к требуемому столбцу, содержащему числа.

См. Фрагмент кода ниже:

cat file | тр-с '' | cut -d '' -f 8

25
27.01.2020, 19:40

Используйте лайнер perl one -вот так:

perl -lane 'print $F[-2]' input_file

Пояснение:

Опция -eзаставляет интерпретатор perl искать сценарий внутри файла, а не в файле.

Опция -nвызывает построчное чтение входного (файла или STDIN из канала ).

Опция -lудаляет разделитель входных записей (зависит от ОС -, перевод строки в UNIX по умолчанию )после чтения строки и добавляет его в конце каждойprint

Опция -aприводит к тому, что каждая входная строка разбивается на пробелы в массив @F, а $F[-2]— это второй элемент, считая с конца, который является нужным полем. Вы также можете использовать $F[$#F-1], где $#F— последний индекс массива @F, который немного хуже читается.

1
27.01.2020, 19:40

правильный вариант для столбцов ввода в cut будет

cut -c35-38
2
20.06.2020, 02:36

Теги

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