Как сделать 'голову' и 'хвост' на разграниченном пустым указателем входе в ударе?

Много дистрибутивов Linux имеют mountpoint команда. Это может явно используемый, чтобы проверить, является ли каталог точкой монтирования. Простой как это:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi
18
10.05.2013, 01:03
1 ответ

GNU head и tail с тех пор coreutils версия 8.25 имеют a -z опция для этого.

С более старыми версиями или для систем не-GNU, можно попытаться подкачать \0 и \n:

find ... -print0 |
  tr '\0\n' '\n\0' |
  head |
  tr '\0\n' '\n\0'

Обратите внимание что некоторые head реализации не могут справиться с символами NUL (и они не обязаны POSIX), но где находят поддержки -print0, head и текстовые утилиты обычно поддерживают символы NUL.

Можно также использовать функцию для обертывания любой команды между двумя trs:

nul_terminated() {
  tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}

find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...

Следует иметь в виду это под nul_terminated, a \0 означает символ новой строки. Так, например, для замены \n с _:

find . -depth -name $'*\n*' -print0 | nul_terminated sed '
  p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv

(\x0 будучи также расширением GNU).

Если необходимо выполнить больше чем одну команду фильтрации, можно сделать:

find ... -print0 |
  nul_terminated cmd1 |
  nul_terminated cmd2 | xargs -r0 ...

Но это означает выполнять некоторых избыточных tr команды. С другой стороны, можно работать:

find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...
21
27.01.2020, 19:46
  • 1
    Не Делает этого поражения основная причина ¹ для использования \x0 вместо \n разграничить значения? (¹, таким образом, можно справиться со значениями, которые могли бы содержать \n) –  Thedward 13.11.2014, 00:02
  • 2
    @Thedward, нет, наоборот -print0 | tr '\n\0' '\0\n' имеет строки, представляющие пути к файлам, где символы новой строки в них были преобразованы в \0. Так, если Вы проводите первую строку с head -n 1 и преобразуйте \0s назад к новым строкам с tr '\0\n' '\n\0' снова, Вам NUL-разграничили первый путь к файлу с его встроенными символами новой строки. –  Stéphane Chazelas 13.11.2014, 00:08

Теги

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