Как правильно передать $ '\ n' из sed в xargs echo? - PullRequest
0 голосов
/ 02 июня 2018

Проблема

Я хочу преобразовать строку путей (где каждый путь может содержать экранированные пробелы) в печатный список путей.Я в основном использую echo и sed, и проблема заключается в этом (см. Ниже).

Например, я хочу, чтобы эти три файла:

one two three\ two\ one

были напечатаныв трех строках:

one
two
three two one

Проблема с "sed" и "echo"

(1) Это три примера файлов: "один", "два" и "три два один"".

echo "one two three\ two\ one"

# one two three\ two\ one

(2) Я заменяю пробел, разделяющий файлы, новой строкой.

echo "one two three\ two\ one" | sed 's/\([^\]\) /\1$'"'"'\\n'"'"'/g'

# one$'\n'two$'\n'three\ two\ one

(3) Я проверяю это, действительно" повторяя "вывод вышеприведенногоприводит к выводу, который я хочу.

echo one$'\n'two$'\n'three\ two\ one

# one
# two
# three two one

Сочетая (2) и (3), функции ломаются с помощью "xargs echo":

echo "one two three\ two\ one" | sed 's/\([^\]\) /\1$'"'"'\\n'"'"'/g' | xargs echo

# one$\ntwo$\nthree two one

Как исправить подстановку sed?

Как можно исправить подстановку sed, чтобы эхо-вывод дал:

one
two
three two one

Я ищу решение, которое использует в основном "echo" и "sed" (не ищудругие решения).

Я также не могу использовать "echo -e" для интерпретации экранированных символов.

Ответы [ 3 ]

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

Не решение, а ответ на комментарий, который вы сделали в своем посте "почему xargs echo" не работает, посмотрите этот ответ относительно того, что такое $ '\ n':

https://stackoverflow.com/a/4128305/4092051

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

Вот как вы показываете свои имена файлов на экране, разделенные переводом строки:

find "$PWD" -maxdepth 1 -print

Если вы хотите обработать их каким-либо образом, вы должны передать их \0 в отдельности (используя -print0) или использоватьfind -exec.Попытка отформатировать их как слова оболочки - не самый лучший способ.

Причина, по которой echo не показывает ожидаемого значения, заключается в том, что $'\n' - это синтаксис Bash, означающий буквальный перевод строки.Это не echo синтаксис, и echo не участвует в его интерпретации.

Для dash, xargs и других более традиционных инструментов, $'\n' простостранный способ форматирования буквенных символов доллар-обратный слеш-н ($\n).

Поскольку вы используете xargs echo, bash не задействован, поэтому вместо него вы получите $\n.Решение состоит не в том, чтобы пытаться отформатировать данные в коде таким образом, чтобы код возвращал исходные данные.Решение состоит в том, чтобы полностью пропустить этот шаг и просто позволить данным быть данными, как в первоначальном примере.

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

Эта команда работает для меня:

echo "one two three\ two\ one" | sed 's/\([^\]\) /\1\n/g' | sed 's/\\ / /g' | xargs -L1 -I {} echo -{}-

Трюк был

  • заменить \\n на \n
  • использовать -L1 в xargsпараметры
  • Я использовал {} и -I{} только для демонстрации того, что эхо-вызов вызывается для каждой строки
...