Как использовать awk, чтобы добавить каталог к ​​списку файлов в переменной? - PullRequest
0 голосов
/ 15 февраля 2019
#!/bin/bash
FILES='a.txt
b.txt
c.txt'
OUT_FILES=$(awk -F ' ' \$0=\"foo/bar/\"\$0 <(echo ${FILES}))

echo ${OUT_FILES}

В приведенном выше сценарии я ожидаю список файлов в ${OUT_FILES} как foo/bar/a.txt foo/bar/b.txt foo/bar/c.txt, но на выходе будет foo/bar/a.txt b.txt c.txt.Позднее список ${OUT_FILES} предоставляется другой команде с xargs.Что не так с выражением awk, которое приводит только к добавлению пути к первому элементу списка?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Использование массива было бы намного лучшим способом хранения имен файлов:

dirname="/tmp/foo"
files=( a.txt b.txt c.txt )
out_files=( "${files[@]/#/$dirname/}" )

Давайте посмотрим, что теперь содержат эти массивы:

$ declare -p files out_files dirname
declare -a files='([0]="a.txt" [1]="b.txt" [2]="c.txt")'
declare -a out_files='([0]="/tmp/foo/a.txt" [1]="/tmp/foo/b.txt" [2]="/tmp/foo/c.txt")'

"${files[@]/#/$dirname/}" довольнохитрое расширение параметра :

  • ${parameter/pattern/string} заменяет первое вхождение шаблона на указанную строку
    • если pattern начинается с #, то сопоставление будет привязано к началу значения $ параметра
    • , поэтому я сопоставляю пустая строка в начале значения и замена этой пустой строки значением $ dirname и литеральной косой чертой
  • if параметр - это расширение массива, тогда замена шаблона будет происходить для каждого элемента массива.

Еще один момент, на который следует обратить внимание, не используйте ALLCAPS_VARNAMES: слишком просто переписать критически важную оболочкупеременные (например, $ PATH).

0 голосов
/ 15 февраля 2019

цитаты отсутствуют, также будет чище таким образом.

$ awk '{print "foo/bar/" $0}' <<< "$FILES"
foo/bar/a.txt
foo/bar/b.txt
foo/bar/c.txt

возможно проще с sed

$ sed 's_^_foo/bar/_' <<< "$FILES"
foo/bar/a.txt
foo/bar/b.txt
foo/bar/c.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...