Как изменить вывод в конвейере команд удара

Функция не может влиять на позиционные параметры своей вызывающей стороны. Это дизайном: позиционные параметры предназначены, чтобы быть частными к функции.

Сделайте свою функциональную работу над массивом.

myfunction () {
  local _myfunction_arrayname=$1
  shift
  … # work on the positional parameters
  eval "$_myfunction_arrayname=(\"\$@\")"
}
myfunction foo "$@"
set -- "${foo[@]}"

В ksh93 и ударе, существует окольный способ сделать что-то приближающееся путем объединения псевдонима и . (source) встроенный с заменой процесса. Пример.

alias myfunction='. <(echo myfunction_body \"\$@\"; echo set -- "\"\${new_positional_parameters[@]}\"")'

Поместите суть работы функции в myfunction_body и заставьте его установить массив new_positional_parameters. После вызова к myfunction, позиционные параметры устанавливаются на значения это myfunction_body вставляет new_positional_parameters.

9
05.02.2014, 01:44
3 ответа

awk

$ some-command | awk '{print "Hi "$1" Bye"}'

sed

$ some-command | sed 's/\(.*\)/Hi \1 Bye/'

Примеры

Используя awk:

$ echo -e "John\nBob\nLucy" | awk '{print "Hi "$1" Bye"}'
Hi John Bye
Hi Bob Bye
Hi Lucy Bye

Используя sed:

$ echo -e "John\nBob\nLucy" | sed 's/\(.*\)/Hi \1 Bye/'
Hi John Bye
Hi Bob Bye
Hi Lucy Bye
15
27.01.2020, 20:04
  • 1
    , который Вы забыли some-command | paste -d\ <(printf '%s\n' Hi Hi Hi) - <(printf '%s\n' why Why WHY??) –  kojiro 05.02.2014, 05:17
  • 2
    @kojiro - не чувствовал paste путь сегодня, ключи 8-) –  slm♦ 05.02.2014, 05:20

Код ниже строки чтений после строки, храня его в переменной LINE. В цикле каждая строка записывается обратно к стандартному выводу с добавлением "Привет" и "До свидания"

#!/bin/bash

while read LINE ; do
   echo "Hi $LINE Bye"  
done
5
27.01.2020, 20:04

Цикл с условием продолжения Bash и каналы:

echo -e "John\nBob\nLucy" | while read n; do echo "hi $n bye"; done
4
27.01.2020, 20:04

Теги

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