Как xargs форматирует ввод $ '\ n'? - PullRequest
0 голосов
/ 04 июня 2018

Задача

(1) При заданной строке я заменяю пробелы на $'\n', используя sed:

echo "one two" | sed 's/ /$'"'"'\\n'"'"'/g'

Это выводит:

# one$'\n'two

(2) Обратите внимание, что повторение этого вывода (1):

echo one$'\n'two

приводит к:

# one
# two

(3) Я повторяю вывод (1) другим способом, передавая вывод (1) в xargs echo:

echo "one two" | sed 's/ /$'"'"'\\n'"'"'/g' | xargs echo

Но я не получаю такой же вывод, как (2):

# one$\ntwo

Вопрос

Что делает xargs при форматировании ввода строки, содержащей $'\n'?

Почему вывод строки с $'\n' не то же самое, что использование xargs echo в той же строке?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Не уверен, отвечая на ваш вопрос, но уловка, которую я использовал в прошлом для подобных случаев, состоит в том, чтобы вместо этого использовать printf, который перебирает переданные аргументы в цикле (если не достаточно % для их использования),Например:

$ printf "%s\n" one two
one
two

Использовать собственный разделитель пробелов в оболочке, если выше, в одной строке

$ args="one two"
$ printf "%s\n" $args
one
two

Только для полноты, передать xargs -n1 с некоторыми foo скриптлет

$ printf "%s\n" one two |xargs -n1 sh -c 'echo [$(date -R)] foo=$1' --
[Sun, 03 Jun 2018 21:34:17 -0300] foo=one
[Sun, 03 Jun 2018 21:34:17 -0300] foo=two
0 голосов
/ 04 июня 2018

Когда вы пишете

echo one$'\n'two

в командной строке, bash заменяет "$ '\ n'" на новую строку.Но когда вы передаете его на xargs, такая замена не может произойти.

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

$ echo "one two" | tr ' ' '\n' | xargs echo
one two

Вы должны указать xargs использовать другой разделитель, даже если он фиктивный:

$ echo "one two" | tr ' ' '\n' | xargs -0 echo
one
two
...