Xargs, разделенные символом новой строки
Можно ли сделать xargs
использовать только перевод строки в качестве разделителя? (в bash для Linux и OS X, если это имеет значение)
я знаю -0
можно использовать, но это PITA, так как не каждая команда поддерживает вывод с разделением NUL.
5 ответов
Нечто подобное
alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command
должно сработать.
GNU xargs (по умолчанию в Linux; установить findutils
из MacPorts на OS X, чтобы получить его) поддерживает -d
который позволяет указать пользовательский разделитель для ввода, так что вы можете сделать
ls *foo | xargs -d '\n' -P4 foo
С Bash я обычно предпочитаю избегать xargs для чего-либо менее хитрого, в пользу циклов while-read. На ваш вопрос while read -ar LINE; do ...; done
делает работу (не забудьте использовать синтаксис массива с LINE, например, ${LINE[@]}
для всей линии). Это не требует хитрости: по умолчанию чтение использует только \n
как символ конца строки.
Я должен опубликовать вопрос на SO о плюсах и минусах циклов xargs и while-read... готово!
$ echo "1\n2 3\n4 5 6" | xargs -L1 echo "#"
# 1
# 2 3
# 4 5 6
Пожалуйста , используйте опцию -d xargs
--delimiter=delim, -d delim
Элементы ввода завершаются указанным символом. Указанный разделитель может быть одиночным символом, escape-символом в стиле C, например \ n, или восьмеричным или шестнадцатеричным escape-кодом. Восьмеричные и шестнадцатеричные escape-коды понимаются как для команды printf. Многобайтовые символы не поддерживаются. При обработке ввода кавычки и обратная косая черта не являются особенными; каждый символ во вводе воспринимается буквально. Параметр -d отключает любую строку конца файла, которая рассматривается как любой другой аргумент. Вы можете использовать эту опцию, когда входные данные состоят просто из элементов, разделенных новой строкой, хотя почти всегда лучше разрабатывать свою программу, чтобы использовать --null там, где это возможно.
Пример:
$ echo 'for arg in "$@"; do echo "arg: <$arg>"; done' > show_args
$ printf "a a\nb b\nc c\n"
a a
b b
c c
$ printf "a a\nb b\nc c\n" | xargs -d '\n' bash show_args
arg: <a a>
arg: <b b>
arg: <c c>
Не со стандартной версией. У меня есть взломанная версия, которая делает это - я использовал ее раньше, чем узналfind ... -print0 | xargs -0 ...
". Свяжитесь со мной, если хотите получить копию - смотрите мой профиль. (Никакой ракетостроения - это только делает работу. Это не полная копия xargs.)
Как насчет cat file | xargs | sed 's/ /\n/ig'
это преобразует пробелы в переводы строк, используя стандартные инструменты Linux bash.