Цикл сценария Bash объединяет каналы/перенаправления на основе переменных имен

Попробуйте это,

sed -i 's/<FOLDER NAME="[A-Z]*"/<FOLDER NAME="'$FLDR'"/g' Gather.XM
0
27.03.2020, 14:38
2 ответа

Самый простой способ — выполнять их рекурсивно по одному:

filter() {
  if [ "$#" -eq 0 ]
  then
    cat
  else
    f="$1"
    shift
    tee >(grep "$f" > "$f") | filter "$@"
  fi
}

printf '%s\n' {foo,bar}{0..100} | filter foo bar r3

Однако это добавляет ряд дополнительных буферов и шагов, так что в качестве альтернативы вы можете осторожно использовать eval. Это нормально, потому что имена файлов тщательно экранируются :

.
filter() {
   cmd="tee "
   for f in "$@"
   do
     cmd+=">(grep -e ${f@Q} > ${f@Q}) "
   done
   eval "$cmd"
}
0
19.03.2021, 02:31

Это можно сделать с помощьюeval:

# usage xfilter filter_spec filter_args...
xfilter() {
    local cmd flt=$1; shift
    printf -v cmd " >($flt)" "$@"
    eval "tee $cmd"
    wait
}

$ echo paa | xfilter 'sed %q' s/a/e/g s/a/o/g
paa
pee
poo

$ tgrep(){ grep "$1" > "./$1"; }
$ printf '%s\n' foo bar | xfilter 'tgrep %q' foo bar
foo
bar
$ grep. foo bar
foo:foo
bar:bar

И нет, вообще никаких проблем с evalпри разумном использовании. В конце концов, bash будет вызывать evalдля каждой строки вашего скрипта отдельно, подумайте об этом на секунду.

0
19.03.2021, 02:31

Теги

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